Terdonの例3は、以下に由来します。https://unix.stackexchange.com/a/612718/182280:
.sh
名前で終わるファイル以外のすべてのファイルを選択してください。.jkl
$ shopt -s extglob nullglob $ files=(!(*.sh|*.jkl)) $ echo "${files[@]}" file.abc file.ABC file.def file.ghi
問題は、ファイルの空白が原因でスクリプトが失敗することです。
for f in ${files[*]} #https://unix.stackexchange.com/q/278502/182280
do
echo "Processing $f file... "
done
たとえば、fi le1.jkl
ファイルの空白は、スクリプトが処理されたときにファイルを「中断」し、次を返します。
processing `fi` file...
processing `le1.jkl` file...
スペースがファイル名を「中断」しないようにする方法は?
背景/質問を明確にするのに役立つコメントをお寄せいただきありがとうございます。
答え1
バラよりコメントループのソースは次のとおりです。"${files[@]}"
代わりに使用する必要があります${files[*]}
。これにより、配列内の各項目が正しく参照され、全体として処理されますfor
。
for f in "${files[@]}"
do
echo "Processing $f file... "
done
バラより配列の Bash マニュアルセクション詳細:
参照配列のすべての要素を使用できます。シェルのファイル名拡張演算子との競合を防ぐには、中かっこが必要です。もし
${name[subscript]}
下付き文字'@
'または'*
'の場合、単語は配列名のすべてのメンバーに展開されます。これらの下付き文字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合は、単一の単語に展開され、${name[*]}
各配列メンバーの値は変数の最初の文字で区切られ、IFS
name${name[@]}
の各要素は別々の単語に展開されます。
また、見ることができます$*と$@の違いは何ですか?