文件名中的空格“破坏”文件名脚本

文件名中的空格“破坏”文件名脚本

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 手册中有关数组的部分详情:

可以使用 引用数组的任何元素。需要使用大括号以避免与 shell 的文件名扩展运算符发生冲突。如果${name[subscript]}下标是 ' @' 或 ' *',该词将扩展为数组名称的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果单词用双引号引起来,则${name[*]}扩展为单个单词,每个数组成员的值由变量的第一个字符分隔IFS,并将${name[@]}name 的每个元素扩展为单独的单词。

也可以看看$* 和 $@ 有什么区别?

相关内容