Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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.

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi
share|improve this question
1  
Lose the [] and it'll work. Though you probably want to quote your pattern: if grep -q "^$1" schemas.txt; then … –  derobert Sep 18 '12 at 19:25

2 Answers 2

up vote 11 down vote accepted

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 ])

share|improve this answer
    
Thanks! It definitely was much easier than I was making it. –  Lauren Sep 18 '12 at 17:43
    
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? –  Lauren Sep 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 –  derobert Sep 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? –  Lauren Sep 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. –  derobert Sep 18 '12 at 19:21

Another simple way is to use grep -ci.
The return value is as in C: return 1 if true and 0 if false.

share|improve this answer
3  
More precisely, it will output 1 if found only once. To output 1 regardless the amount of found matches use grep -cim1 instead. –  manatwork Apr 29 '13 at 10:26
    
thanks for the correction –  amigal Apr 29 '13 at 11:34

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.