2

whileで50人のユーザーを作成するBASHファイルを作成したいと思います。しかし、実行すると問題が発生しました。

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

あなたへのThx

4

3 に答える 3

1

bashイディオムを使用すると、スクリプトは次のように記述された方がよいでしょう。

limite=51

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

またはさらに良い(より速くなります):ファイルにすべてのユーザー名を入力します。たとえばuser.txt、1行に1つの名前を入力し、実行します。

while read name; do sudo useradd "$name"; done < user.txt
于 2012-12-20T12:17:16.323 に答える
0

シェルは、空白が必要な場所(いわゆる単語分割を実行するため)についてかなり衒学的です。

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

もう1つのヒント:セミコロン;ステートメントの区切り文字であり、その前に空白は必要ありません。

于 2012-12-20T09:40:29.840 に答える
0

[は実際にはコマンドであるため、その後にスペースが必要です。4行目は

while [ $numero != $limite ]

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

catfile1不平を言うのと同じように、より多くの情報のために[$numeroman testあるいはman bash

また、これが完全なスクリプトである場合、それは何で$numeroある必要があります$numか?

于 2012-12-20T09:41:32.570 に答える