在bash脚本中,当输入行包含起始注释标记/ *时,它将被评估为根目录“/”中的所有条目。我们怎样才能避免这种情况?
编辑:评论中的代码更易读:
while read line; do
echo -e "input line: [$line]"
aaa=`echo -e $line`
echo -e "aaa=$aaa"
done < $infile
答案 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"