Wildcards
文件名中的空格“中斷”文件名腳本
來自https://unix.stackexchange.com/a/612718/182280的 Terdon 範例 3 :
- 選擇除名稱以
.sh
or結尾的文件以外的所有文件.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 $ @?