Wildcards

文件名中的空格“中斷”文件名腳本

  • October 5, 2020

來自https://unix.stackexchange.com/a/612718/182280的 Terdon 範例 3 :

  1. 選擇除名稱以.shor結尾的文件以外的所有文件.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...

可以做些什麼來確保空格不會“破壞”文件名?

有助於澄清上下文/問題的評論表示讚賞。

請參閱有關循環來自的問題的評論"${files[@]}":您應該使用而不是${files[*]}. 這將確保數組中的每個條目都被正確引用,並通過以下方式作為一個整體進行處理for

for f in "${files[@]}"
do
echo "Processing $f file... "
done

有關詳細資訊,請參閱數組的 Bash 手冊部分

可以使用 引用數組的任何元素。需要大括號以避免與 shell 的文件名擴展運算符衝突。如果下標是 ’ ’ 或 ’ ‘,則單詞擴展為數組名稱的所有成員。只有當單詞出現在雙引號中時,這些下標才會有所不同。如果單詞是雙引號,則擴展為單個單詞,其中每個數組成員的值由變數的第一個字元分隔,並將name 的每個元素擴展為單獨的單詞。${*name*[*subscript*]}``@``*``${name[*]}``IFS``${name[@]}

另請參閱有什麼區別 $ * and $ @?

引用自:https://unix.stackexchange.com/questions/612808