在变量替换后防止globbing

时间:2012-05-04 15:50:10

标签: bash shell escaping glob

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

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

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

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

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

任何建议的诉讼

编辑:唯一缺少的答案是当文件名在shell变量“$ file”中时,如何从包含用于globbing的特殊字符的名称中读取文件。 G。 command1&lt; “$文件”。

3 个答案:

答案 0 :(得分:9)

作为在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
'

答案 1 :(得分:5)

您可以使用set -f关闭通讯,然后在set +f的脚本中将其重新打开。

答案 2 :(得分:1)

改为使用while read

cat files | while read file; do
    command1 < "$file"
    echo "$file"
done