3

I have a Bash script which passes patterns and switches to grep.

#!/bin/bash

foo() {
    grep $@ *.txt
}

foo $@

And, of course, myscript SomeText works but myscript "Text1 Text2" does not. Is there a way to keep the quotes when passing arguments from script to foo() and then from foo() to grep?

Note, that I cannot simply use eval and wrap the whole $@ before grep since it can also contain switches so I need to keep the original quoting as passed from the command line.

Thanks.

jackhab
  • 17,128
  • 37
  • 99
  • 136

2 Answers2

2

Your grep command looks incomplete, have you script like this with quoted parameters:

#!/bin/bash
set -x # for debug purpose only, comment out later

foo() {
    grep "$@" *.txt
}

foo "$@"

And call it like this:

./myscript "Text1 Text2"
anubhava
  • 761,203
  • 64
  • 569
  • 643
2

Simply quote the $@:

#!/bin/bash 

foo() { 
    grep "$@" 
} 

foo "$@" 

This is a difference between $@ and $*.

cdarke
  • 42,728
  • 8
  • 80
  • 84