Can grep return true/false or are there alternative methods
As part of this script i need to be able to check if the first argument given matches the first word of the file If it does, exit with an error message; if it doesn't, append the arguments to the file. I understand how to write the if
statement, but not how to use grep
within a script. I understand that grep
will look something like this
grep ^$1 schemas.txt
I feel like this should be much easier than I am making it.
I'm getting an error "too many arguments" on the if
statement. I got rid of the space between grep -q
and then got an error binary operator expected.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
grep
returns a different exit code if it found something (zero) vs. if it hasn't found anything (non-zero). In an if
statement, a zero exit code is mapped to "true" and a non-zero exit code is mapped to false. In addition, grep has a -q
argument to not output the matched text (but only return the exit status code)
So, you can use grep like this.
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
As a quick note, when you do something like if [ -z "$var" ]…
, it turns out that [
is actually a command you're running, just like grep. On my system, it's /usr/bin/[
. (Well, technically, your shell probably has it built-in, but that's an optimization. It behaves as if it were a command). It works the same way, [
returns a zero exit code for true, a non-zero exit code for false. ( test
is the same thing as [
, except for the closing ]
)