如何避免“/ *”替换bash脚本中根目录中的files / dirs?

时间:2011-04-06 01:07:34

标签: bash

在bash脚本中,当输入行包含起始注释标记/ *时,它将被评估为根目录“/”中的所有条目。我们怎样才能避免这种情况?

编辑:评论中的代码更易读:

while read line; do
    echo -e "input line: [$line]"
    aaa=`echo -e $line`
    echo -e "aaa=$aaa"
done < $infile 

2 个答案:

答案 0 :(得分:2)

你可以告诉bash在进行文件扩展时忽略某些模式:

$ export GLOBIGNORE='/*'
$ ls /* | wc
ls: cannot access /*: No such file or directory
      0       0       0

或者您可以使用set builtin set -f

完全禁用路径名扩展

答案 1 :(得分:1)

每当你使用一个变量而不将它放在双引号中时,它的值在被替换之后会以几种方式解析:它被分解成“单词”,并且通配符被扩展。在您的情况下,行:

aaa=`echo -e $line`

引起麻烦,因为$line周围没有引号 - 它会扩展通配符,将空格,制表符等字符串转换为单个空格,也可能是其他一些我没有的东西。顺便说一句,read line将修剪前导和尾随空格,并加入以反斜杠结尾的行;如果您不想这样,请改用IFS= read -r line。最后,使用echo -e两次将导致输入文件中的转义序列的双重解释。这是我推荐的重写:

while IFS= read -r line; do
    echo -e "input line: [$line]"
    aaa=$(echo -e "$line")
    echo "aaa=$aaa"
done < "$infile"