6

私はシェルスクリプトを学ぼうとしているので、何もしないループを持つ単純なスクリプトを作成しました。

#!/bin/bash
names=(test test2 test3 test4)
for name in ${names[@]}
do
        #do something
done

ただし、このスクリプトを実行すると、次のエラーが発生します。

./test.sh:6行目:予期しないトークンの近くで構文エラーが発生しました'
./test.sh:6行目:完了しました'

私はここで何を逃しましたか?シェルスクリプトは「タブセンシティブ」ですか?

4

6 に答える 6

7

いいえ、シェル スクリプトはタブを区別しません (この例では行っていない、本当にクレイジーなことをしない限り)。

空のwhile do doneブロックを持つことはできません (コメントはカウントされません)echo $name代わりに置き換えてみてください

#!/bin/bash
names=(test test2 test3 test4)
for name in ${names[@]}
do
       printf "%s " $name
done
printf "\n"

出力

test test2 test3 test4
于 2012-05-10T12:51:16.840 に答える
6

dashこの場合、とbashは少し脳死状態です。これらは空のループを許可しないため、これを実行するには no op コマンドを追加する必要がありtrueます::私のテストでは、少し高速であることが示唆されていますが、同じである必要がありますが、理由はわかりません:

time (i=100000; while ((i--)); do :; done)

n 平均は0.262数秒かかりますが、次のようになります。

time (i=100000; while ((i--)); do true; done)

数秒かかり0.293ます。興味深いことに:

time (i=100000; while ((i--)); do builtin true; done)

数秒かかり0.356ます。

すべての測定値は 30 回の実行の平均です。

于 2012-05-10T12:52:18.940 に答える
4

Bash には組み込みの no-op であるコロン (:) があり、実行する別のプロセスを生成するよりも軽量ですtrue

#!/bin/bash
names=(test test2 test3 test4)
for name in "${names[@]}"
do
    :
done

編集: ウィリアムは、これもシェルの組み込みであると正しく指摘しているtrueため、この回答は、true を使用するよりも優れた解決策ではなく、参考までに別のオプションと見なしてください。

于 2012-05-10T13:16:10.503 に答える
1

ループに何かが必要です。そうしないと、bash が文句を言います。

于 2012-05-10T12:52:39.143 に答える
1

代わりに、nothing を「true」に置き換えることができます。

于 2012-05-10T12:42:49.130 に答える