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'.这不是我想要的.我如何得到我正在寻找的行为?
问题是
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)
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)
实际上你可以更简单,因为如果发现某些东西,grep的返回码将为0(否则为1),因此你不需要wc -l.你可以写:
if `grep -q pattern file`; then echo "yes"; else echo "no"; fi;
Run Code Online (Sandbox Code Playgroud)