Linux bash脚本 - For循环问题

3

我正在编写一个批处理的bash脚本,用于添加用户。以下是代码:

#!/bin/bash
# A script that creates users.

echo "This is a script to create new users on this system."
echo "How many users do you want to add?"
read am
echo " "

for i in {0..$am..1}
do
    echo "Enter a username below:"
    read usern
    sudo useradd $usern

    sudo passwd $usern

    echo " "
    echo "User $am '$usern' added."
done

在这种情况下,我想要创建4个用户。我输入了用户名“callum3”,并将密码设置为“1234”以便于登录。一旦我正确地输入了所有信息,终端窗口会显示以下内容:
User 4 'callum3' added.

这表明我的for循环实际上没有起作用,但我并没有发现任何错误。我尝试使用while循环,但也没有成功。这是我犯了新手错误还是有更深层次的问题?
3个回答

1
尽管我怀疑过,但为了更好地理解脚本可能出现的问题,我将其粘贴到shellcheck.net中。问题在于以下行:
for i in {0..$am..1}

Bash不支持在大括号范围扩展中使用变量。也就是说,您不能在像{..}这样的表达式中使用变量。

相反,使用seq。使用seq $var可以获得从1(默认)到$var的序列:

for i in $(seq "$am")

1
这个完美地解决了!谢谢,这个问题困扰我有一段时间了。 - CallumWale
很高兴看到这个 :) 除非你之前遇到过这个问题,否则它并不是很明显! - fedorqui
1
@CallumWale 如果你在发布的代码片段上运行 shellcheck,它也会自动指出。 - that other guy
谢谢你指出来,那个人 :) 我不知道这样的东西存在。 - userABC123
@thatotherguy 是对的,我正想留言表达同样的意见;但是因为解决方案需要一些解释,所以我花了时间来发布了一个答案。刚刚更新了帖子并提到了网站。 - fedorqui
1
当然,我只是为了楼主将来的方便而言。 - that other guy

1

我觉得有点遗漏,因为没有人建议使用算术for循环:

for ((i=0; i<am; i++)); do
    …
done

在bash中,这样做的特别之处在于它既易读又不需要子shell。

0

您可以使用:

for i in `seq 0 $((am-1))`
do
...
done

序列将从0开始,以$am-1结束


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接