2011-04-06 77 views
1

在bash脚本中,当输入行包含起始评论标记/ *时,它会被评估为根目录“/”中的所有条目。我们如何避免这种情况?如何避免“/ *”替代bash脚本根目录中的文件/目录?

编辑:代码在更可读的形式评论:

​​
+0

在bash脚本中,起始注释标记是'#',而不是'/ *'。 – davmac 2011-04-06 01:09:21

+0

在读取行时发布代码 – SiegeX 2011-04-06 01:10:31

+0

的snippit;做 echo -e“input line:[$ line]” aaa ='echo -e $ line' echo -e“aaa = $ aaa” done <$ infile – user693986 2011-04-06 01:38:29

回答

2

你可以告诉庆典做文件展开时忽略某些模式:

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

,或者你可以完全禁用路径扩展使用设置内建:set -f

+0

谢谢,它工作正常。 – user693986 2011-04-06 01:48:16

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"