使用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; “$文件”。的
答案 0 :(得分:9)
作为在set -f
和set +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