I'm trying to write this script for an assignment - it's only the second one I've written so bear with me.

As a part of this script, I need to be able to check if the first argument given matches the first word of 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. Any help appreciated.

Update:
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. I've been poking around at it, but I don't see what it sees.

2 Answers
2

grep returns a different exit code if its found something (zero) vs. if it hasn't found something (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 ])

Why doesn't the if statement need the brackets? I have it working without, but don't understand why. Can I still nest it without the brackets?
–
LaurenSep 18 '12 at 18:47

@Lauren did you miss the quick note? [ is not part of the if syntax, it's (conceptually) a command you're running, just like grep
–
derobertSep 18 '12 at 19:06

Ok. I read it, just having trouble understanding it. So, since grep -q itself is returning a true/false value, it is unnecessary and problematic to use the command [ also?
–
LaurenSep 18 '12 at 19:19

@Lauren You don't use grep inside of [, you use one or the other, depending on what condition you want to check. (You can use any command inside an if, btw, if just checks exit code.) … well, I guess you probably could come up with a reason to use grep inside [, but that'd be a fairly complicated script, and its not a normal thing to do.
–
derobertSep 18 '12 at 19:21