ファイルを作成するとします~/myScript.sh
。
#!/bin/sh
for myVar; do
echo "Hi"
done
引数なしで実行するとbash myScript
何も得られませんが、1つ以上の引数を使用して実行すると、これらの変数の数に応じて出力が得られます(変数は渡された引数にスクリプトを依存させるようです)。
bash ~/myScript.sh arg0 arg1
未定義の変数に基づくforループは、それ自体にmyVar
適用され(誤って表現された場合は申し訳ありません)、次の出力を取得します。arg0
arg1
こんにちは
こんにちは
(パラメータごとに1つの「hi」)
最初は、ループが1つのパラメータとして機能すると仮定しました。したがって、andfor
があり、andがある場合、andは機能しますが、追加のテストを試してみました。すべてのループはすべてのパラメータで機能します。myVar_0
myVar_1
arg0
arg1
myVar_0
arg_0
myVar_1
arg1
for
#!/bin/sh
for myVar_0; do
echo "Hi"
done
for myVar_1; do
echo "Hello"
done
返されますbash myScript arg0 arg1
:
こんにちは
こんにちは
こんにちは
こんにちは
注:「forループごとに1つの引数」が必要な場合は、ローカルスコープでBash関数を使用する必要があるとします。
私の質問
Bashに一致する「すべてのforループのすべてのパラメータ」の名前は何ですか?
答え1
myVar
位置引数を使用してスクリプトを呼び出す場合は、未定義です。メンズバッシュから:
For the name [ [ in [ word... ] ] ] list of things to do; done
[...] in 単語を省略すると、for コマンドは各位置パラメーター・セットに対してリストを 1 回実行します。
しかし、あなたはそれを使用しません$myVar
。
for myVar; do
echo "$myVar"
done
答え2
Bash / POSIXシェルのループはPythonのループfor
と似ていますfor
。ループ変数はリストされた値を1つずつ取得し、ループ本体は各値に対して1回実行されます。
だからこれ:
for x in foo bar; do
echo "$x"
done
echo finally x is "$x"
似ている
x=foo # assign value
echo "$x" # loop body
x=bar # same with the second value...
echo "$x"
echo finally x is "$x" # this isn't part of the loop body
ループ本文を繰り返す必要がないだけです。配列変数がある場合は、A
配列for x in "${A[@]}"; do...
値を繰り返します。for x in "$@"; do...
位置パラメータ、つまりコマンドラインパラメータは拡張"$@"
内容であるため、同様に繰り返されます。基本的にfor x; do
はただの略語ですfor x in "$@"; do
したがって、これはすべてのコマンドライン引数を印刷します。
xについて#または:"$ @"のxについて。 printf "%s\n" "$x" 完璧
インデックスを使用してパラメータに直接アクセスするには、最初のパラメータ、$1
2$2
番目のパラメータなどを使用してください。
printf "the first arg is %s and the second is %s\n" "$1" "$2"