5

使用 shell 变量 (BASH) 的最优雅方法是什么,该变量包含为通配符(文件名完成)保留的字符,这些字符会触发一些不需要的替换?这是示例:

for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done

文件名包含“[”或“]”等字符。我基本上有两个想法:

1)通过 set -f 关闭 globbing:我在其他地方需要它

2)转义文件中的文件名:BASH 在管道输入标准输入时抱怨“找不到文件”

感谢任何建议

编辑:唯一缺少的答案是当文件名位于shell变量“$file”中时,如何从名称包含用于通配的特殊字符的文件中读取,例如command1 <“$file”。

4

3 回答 3

9

作为在 and 之间切换的替代方法set -fset +f您也许可以只将一个单应用set -f到子 shell,因为父 shell 的环境根本不会受此影响:

(
set -f
for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done
)


# or even

sh -f -c '
   for file in $(cat files); do
      command1 < "$file"
      echo "$file"
   done
'
于 2013-01-18T16:20:17.153 回答
5

You can turn off globbing with set -f, then turn it back on later in the script with set +f.

于 2012-05-04T17:47:50.520 回答
2

改为使用while read

cat files | while read file; do
    command1 < "$file"
    echo "$file"
done
于 2012-05-04T16:18:26.820 回答