Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error using [[ ]] and -eq

Tags:

bash

Shell script snippet:

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

Results in:

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

Context:

I'm trying to detect whether a particular pattern exists in a file so I can take a particular action.

I understand the error I'm getting, the detection is working but the script is trying to evaluate the result '1' and run the program '1' in my path. This isn't what I want. How do I get the behavior I'm looking for?

like image 856
Greg Howell Avatar asked Jun 26 '26 06:06

Greg Howell


2 Answers

The problem is

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

You can't use spaces around the equal sign; what you're actually doing here is to temporarily set tagSearch to the empty string in the environment, then invoking grep '^\#ctags$' ./"$1" | wc -l, then trying to run that as a command since the $() will have inserted the result into the command line.

tagSearch=$(grep '^\#ctags$' ./"$1" | wc -l)
like image 126
geekosaur Avatar answered Jun 28 '26 20:06

geekosaur


Variable assignments in the bash shell should not have a space after the equals. Actually it should never have whitespace in it at all. See below.

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

Not important to your error but also of note, when using the double bracket syntax, you don't need to quote that zero any more than the variable you are comparing it with.

Actually your whole code could be re-factored using grep's quite mode and evaluating the return code to see if you got any matches:

if grep '^\#ctags$' "./$1"
then
    ...
fi
like image 41
Caleb Avatar answered Jun 28 '26 21:06

Caleb



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!