区切り文字を失うことなくスペースを含むファイル名を別の変数に割り当てる方法

区切り文字を失うことなくスペースを含むファイル名を別の変数に割り当てる方法

次の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番目のパラメータの間のすべての区別が消えます。

関連情報