使用`while`和数字关系测试的BASH脚本错误

时间:2012-12-20 09:37:46

标签: bash shell ubuntu

我想用while创建BASH文件来创建50个用户。 但是当我运行它时我遇到了一些问题。

limite=51
num=1

while [$numero != $limite]
do
  echo -n 'enter your name: ' "$num" ; read name
  sudo useradd $name
  num=$(($num + 1))
done

问题来自第1行和第4行

我不知道为什么!?

好吧,我有这个并且它有效

limite=51
num=1

while [ $num != $limite ] ; do
  echo -n 'enter your name: ' "$num" ; read name
  sudo useradd $name
  num=$(($num + 1))   
done

对你来说

3 个答案:

答案 0 :(得分:1)

使用bash惯用法,您的脚本最好写成

limite=51

for ((num=1;num<limite;++num)); do
    read -p "enter your name: $num" name
    sudo useradd "$name"
done

或者更好(它会更快):在文件中输入所有用户名,比如user.txt,每行一个名称,然后运行

while read name; do sudo useradd "$name"; done < user.txt

答案 1 :(得分:0)

对于想要空格的地方(执行所谓的分词),shell非常迂腐:

while [ $numero != $limite ]; do
  echo ...
done

应该做的伎俩。您应该决定是否要使用$numero$num ...因为发布它将无效,因为$numero未初始化使用。

一些背景:while复合语句的语法是

while list; do list; done

列表可以是[之类的程序(谁说程序不能有像/usr/bin/[这样有趣的名字?)所以while实际上调用了[程序4个参数:$numero!=的扩展,$limits]的扩展(这是一个无用的参数,但使语法看起来很漂亮。)

[计划与test计划相同;后者不需要无用的]参数。事实上,我更喜欢使用test编写所有条件:

while test $numero != $limite; do
  echo ...
done

另一个提示:分号;语句分隔符,并且前面不需要空格。

答案 2 :(得分:0)

[实际上是一个命令,所以它需要一个空格,第4行应该是

while [ $numero != $limite ]

# See it's actually a command
$ which [        
/usr/bin/[

就像catfile1会抱怨[$numero一样,请man test获取更多信息,甚至是man bash

此外,如果这是$numero的完整脚本,那么它应该是$num吗?