ファイル名のスペースは、ファイル名スクリプトを「中断」します。

ファイル名のスペースは、ファイル名スクリプトを「中断」します。

Terdonの例3は、以下に由来します。https://unix.stackexchange.com/a/612718/182280:

  1. .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[*]}各配列メンバーの値は変数の最初の文字で区切られ、IFSname${name[@]}の各要素は別々の単語に展開されます。

また、見ることができます$*と$@の違いは何ですか?

関連情報