次のbashスクリプトがあります。
files="${@:2}"
for f in $files; do
echo $f
done
2番目の引数から最後の引数までのシェル拡張を取得して印刷します。ただし、空白のあるファイルには機能しません。ファイルを印刷します。
test image.jpg
〜のように
test
image.jpg
私が使用している場合:
for f in "${@:2}"; do
echo $f
done
$filesに割り当てる必要はありません。うまくいきます。
私も参照で最初のケースを試してみましたが、うまくいきませ"$files"
んでした。すべてのファイルを1行に印刷します。 for inループなどの拡張機能を使用するときにファイル名を別の変数に割り当てて機能させ続けるにはどうすればよいですか?
答え1
これを達成するには、files
変数ではなく配列でなければなりません。努力する:
files=("${@:2}")
for f in "${files[@]}"; do
echo "$f"
done
例:
$ bash script.sh first "test image.jpg" "another test.txt"
test image.jpg
another test.txt
議論する
ソースコードを見て、次の説明を検討してください。
files="${@:2}"
これは、最初の引数以降のすべての引数をfiles
単一の微分文字列として割り当てます。次のスクリプトでこれを確認できます。
$ cat test.sh
files="${@:2}"
declare -p files
$ bash test.sh first "test image.jpg" "another test.txt"
declare -- files="test image.jpg another test.txt"
ご覧のとおり、2番目のパラメータと3番目のパラメータの間のすべての区別が消えます。