On 6/27/2012 11:25 AM, Tim Daneliuk wrote:
On 06/27/2012 09:25 AM, Aleksandr Miroslav wrote:
hello,

I'm not sure if this is the right forum for this question, but here
goes.

I have the following in a shell script:


     #!/bin/sh

     if [ "$#" -eq "0" ]; then
             find /foo
     fi
     if [ "$#" -eq "1" ]; then
             find /foo | grep -i $1
     fi
     if [ "$#" -eq "2" ]; then
             find /foo | grep -i $1 | grep -i $2
     fi
     if [ "$#" -eq "3" ]; then
             find /foo | grep -i $1 | grep -i $2 | grep -i $3
     fi

Is there an easier/shorter way to do this? If there are 15 arguments
supplied on the command line, I don't necessarily want to build 15 if
statements.

Thanks in advance for your answers.

The following solution relies on the fact that you can include multiple
patterns for grep to match with the '-e' argument:


  #!/bin/sh

  PATTERNS=`echo " $*" | sed s/\ /\ -e\ /g`

  find /foo | grep $PATTERNS

Notice that when constructing the $PATTERNS string out of the command line args, you have to quote them with a prepended space character. That's because the subsequent 'sed' substitution needs to find a space *before* each argument
which it then replaces with "-e ".

This will build a multi-grep string for any number of arguments (within reason), functionally a boolean AND search:

#!/bin/sh
final_cmd="find /foo"
while [ $# -gt 0 ]
  do
    final_cmd="$final_cmd | grep -i $1"
    shift
  done
$final_cmd

May need quoting changes, but it worked on this sample, with this result:

cmdline: ./testshift "1" 1 2 3 4 5
result: "find /foo | grep -i 1 | grep -i 1 | grep -i 2 | grep -i 3 | grep -i 4 | grep -i 5"

HTH

Brad

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[email protected]"

Reply via email to