来自https://unix.stackexchange.com/a/612718/182280 的Terdon 示例 3 :
选择除名称以.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...
如何确保空格不会“破坏”文件名?
有助于澄清上下文/问题的评论表示赞赏。
请参阅对循环来自的问题的评论:您应该使用"${files[@]}"
而不是${files[*]}
. 这将确保数组中的每个条目都被正确引用,并通过for
以下方式作为一个整体进行处理:
for f in "${files[@]}"
do
echo "Processing $f file... "
done
有关详细信息,请参阅有关数组的 Bash 手册部分:
可以使用 引用数组的任何元素。需要大括号以避免与 shell 的文件名扩展运算符发生冲突。如果下标是 ' ' 或 ' ',则单词扩展为数组名称的所有成员。仅当单词出现在双引号中时,这些下标才有所不同。如果单词是双引号,则扩展为单个单词,每个数组成员的值由变量的第一个字符分隔,并将name 的每个元素扩展为单独的单词。
${name[subscript]}
@
*
${name[*]}
IFS
${name[@]}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句