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 手册中有关数组的部分详情:
可以使用 引用数组的任何元素。需要使用大括号以避免与 shell 的文件名扩展运算符发生冲突。如果
${name[subscript]}
下标是 '@
' 或 '*
',该词将扩展为数组名称的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果单词用双引号引起来,则${name[*]}
扩展为单个单词,每个数组成员的值由变量的第一个字符分隔IFS
,并将${name[@]}
name 的每个元素扩展为单独的单词。
也可以看看$* 和 $@ 有什么区别?