引数の数が不明なbashスクリプトを書きたいのですが。
これらの議論を通り抜けて、どうすればよいですか?
間違った試みは次のようになります。
#!/bin/bash
for i in $args; do
echo $i
done
これには特別な構文があります:
for i do
printf '%s\n' "$i"
done
より一般的には、現在のスクリプトまたは関数のパラメーターのリストは、特殊変数$@
を介して利用できます。
for i in "$@"; do
printf '%s\n' "$i"
done
$@
を囲む二重引用符が必要であることに注意してください。二重引用符がない場合、パラメーターはワイルドカード拡張とフィールド分割を受けます。 "$@"
は魔法です。二重引用符があっても、パラメータと同じ数のフィールドに展開されます。
print_arguments () {
for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special !\characters' '-n' # prints 4 lines
print_arguments '' # prints one empty line
print_arguments # prints nothing
#! /usr/bin/env bash
for f in "$@"; do
echo "$f"
done
引用符で囲んだり、$@
でエスケープしたりすると、引数にスペース(または改行など)が含まれる可能性があるため、\
を引用符で囲む必要があります。例えば:
./myscript one 'two three'
引用符が原因で、これは3つではなく2つの引数です。 $@
を引用符で囲まないと、それらの引数はスクリプト内で分割されます。