使用[[]]和-eq时出错

时间:2011-07-05 17:21:21

标签: bash

Shell脚本代码段:

tagSearch= $(grep '^\#ctags$' ./"$1" | wc -l)
if [[ $tagSearch -ne "0" ]]
then
    ...
fi

结果:

line 2: /bb/bin/1: Permission denied

上下文:

我正在尝试检测文件中是否存在特定模式,以便我可以采取特定操作。

我理解我得到的错误,检测工作正常但脚本正在尝试评估结果'1'并在我的路径中运行程序'1'。这不是我想要的。我如何得到我正在寻找的行为?

3 个答案:

答案 0 :(得分:7)

问题是

tagSearch= $(grep '^\#ctags$' ./"$1" | wc -l)
----------^

你不能在等号周围使用空格;你在这里真正做的是暂时将tagSearch设置为环境中的空字符串,然后调用grep '^\#ctags$' ./"$1" | wc -l,然后尝试将其作为命令运行,因为$()将插入结果进入命令行。

tagSearch=$(grep '^\#ctags$' ./"$1" | wc -l)

答案 1 :(得分:6)

bash shell中的变量赋值在equals之后不应该有空格。实际上它根本不应该有空格。见下文。

tagSearch=$(grep '^\#ctags$' "./$1" | wc -l)
if [[ $tagSearch -ne 0 ]]
then
    ...
fi

对于您的错误并不重要,但同时请注意,使用double bracket syntax时,您不需要引用该零值,而不是您要与之比较的变量。

实际上你的整个代码可以使用grep的完全模式进行重新计算,并评估返回代码以查看是否有任何匹配:

if grep '^\#ctags$' "./$1"
then
    ...
fi

答案 2 :(得分:5)

实际上你可以更简单,因为如果找到了某些东西,grep的返回码将为0(否则为1),所以你不需要wc -l。你可以写:

if `grep -q pattern file`; then echo "yes"; else echo "no"; fi;