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

Gre*_*ell 2 bash

Shell脚本代码段:

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

结果是:

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

语境:

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

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

gee*_*aur 7

问题是

tagSearch= $(grep '^\#ctags$' ./"$1" | wc -l)
----------^
Run Code Online (Sandbox Code Playgroud)

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

tagSearch=$(grep '^\#ctags$' ./"$1" | wc -l)
Run Code Online (Sandbox Code Playgroud)


Cal*_*leb 6

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

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

对于您的错误并不重要,但同时请注意,使用双括号语法时,您不需要引用该零值,而不是您要与之比较的变量.

实际上你的整个代码可以使用grep相当模式进行重新分解并评估返回代码以查看是否有任何匹配:

if grep '^\#ctags$' "./$1"
then
    ...
fi
Run Code Online (Sandbox Code Playgroud)


yan*_*kee 5

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

if `grep -q pattern file`; then echo "yes"; else echo "no"; fi;
Run Code Online (Sandbox Code Playgroud)