さまざまな理由から、複数の文字列(文字列に複数の単語を含めることができる)をコマンドライン入力として使用する必要があります。例えば、
./temp.sh "OS Lab" "Mad man" "Spiky Boii"
しかし、私は上記を達成できなかったので、私が書いた他のすべてをテストする必要があります。
while read -r line
do
array=("${array[@]}" "$line")
done
さて、上記のコードは要求されたコードではないので、私が望むことをし、同様の機能を得るためにそれを使用しようとしました。
for i in $*
do
array=("${array[@]}" "$i")
done
ただし、初期入力を提供すると、このコードには6つの配列要素が必要です。どうやって入手できますか?
array[0]="OS Lab"
array[1]="Mad man"
array[2]="Spiky Boii"
答え1
次へ変更$*
して$@
引用してください。
for i in "$@"
do
array+=("$i")
done
または、単に次のこともできます。
for i
do
array+=("$i")
done
また、各反復に配列の残りの部分を含める必要はないことに注意してください。+=
毎回完全にリセットする代わりに、配列に要素を追加することができます。
しかし、あなたがやっていることがパラメータを配列に追加するだけであれば、単に次のようにすることができます:
array=("$@")
屋根は必要ありません。
Bash マニュアルで始める特殊パラメータ:
(
$*
)は1から始まる位置引数に拡張されます。拡張が二重引用符内にない場合、各位置引数は別々の単語に展開されます。これらの単語は、実行されるコンテキストで単語分割とパス名拡張がさらに適用されます。二重引用符内で拡張が発生すると、IFS特殊変数の最初の文字で区切られた各引数の値を使用して単一の単語に展開されます。つまり、"$*"
「$1c$2c...」と同じです。ここで、cはIFS変数値の最初の文字です。 IFSが設定されていない場合、パラメーターはスペースで区切られます。 IFS が空の場合、パラメーターの連結時に区切り文字は挿入されません。
(
$@
)は1から始まる位置引数に拡張されます。単語分割を実行する文脈では、これは各位置引数を別々の単語に拡張する。二重引用符内にない場合、これらの単語は単語の分割の対象となります。単語分割が実行されないコンテキストでは、各位置引数はスペースで区切られ、単一の単語に拡張されます。二重引用符内で拡張が行われ、単語の分離が実行されると、各引数は別々の単語に展開されます。つまり、"$@"
「$1」「$2」…単語内で二重引用符拡張が発生すると、最初の引数の拡張は元の単語の先頭に関連付けられ、最後の引数の拡張は元の単語の最後の部分に関連付けられます。位置引数がない場合、"$@"
拡張は$@
空です(つまり削除されます)。
Bash マニュアルで始めるループ構造:
'in Words' が存在しない場合、for コマンドは 'in "$@"' が指定されたように設定された各位置引数に対してコマンドを 1 回実行します。
Bash マニュアルで始めるシェルパラメータ:
シェル変数または配列インデックス(配列を参照)に値を割り当てる割り当てステートメントのコンテキストでは、「+ =」演算子を使用して変数の以前の値に追加または追加できます。