Bash:未定義変数ごとに1つの引数

Bash:未定義変数ごとに1つの引数

ファイルを作成するとします~/myScript.sh

#!/bin/sh

for myVar; do
    echo "Hi"
done

引数なしで実行するとbash myScript何も得られませんが、1つ以上の引数を使用して実行すると、これらの変数の数に応じて出力が得られます(変数は渡された引数にスクリプトを依存させるようです)

bash ~/myScript.sh arg0 arg1

未定義の変数に基づくforループは、それ自体にmyVar適用され(誤って表現された場合は申し訳ありません)、次の出力を取得します。arg0arg1

こんにちは

こんにちは

(パラメータごとに1つの「hi」)


最初は、ループが1つのパラメータとして機能すると仮定しました。したがって、andforがあり、andがある場合、andは機能しますが、追加のテストを試してみました。すべてのループはすべてのパラメータで機能します。myVar_0myVar_1arg0arg1myVar_0arg_0myVar_1arg1for

#!/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"
完璧

インデックスを使用してパラメータに直接アクセスするには、最初のパラメータ、$12$2番目のパラメータなどを使用してください。

printf "the first arg is %s and the second is %s\n" "$1" "$2"

関連情報