112

I've got the following bash two scripts

a.sh:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

The someApp binary receives $* as 2 arguments ('My' and 'Argument') instead of 1.

I've tested several things:

  • Running someApp only thru b.sh works as expected
  • Iterate+echo the arguments in b.sh works as expected
  • Using $@ instead of $* doesn't make a difference
1
  • 7
    try someApp "$*" or someApp "$@" Commented Jun 13, 2013 at 18:13

1 Answer 1

168

$*, unquoted, expands to two words. You need to quote it so that someApp receives a single argument.

someApp "$*"

It's possible that you want to use $@ instead, so that someApp would receive two arguments if you were to call b.sh as

b.sh 'My first' 'My second'

With someApp "$*", someApp would receive a single argument My first My second. With someApp "$@", someApp would receive two arguments, My first and My second.

Sign up to request clarification or add additional context in comments.

4 Comments

The key that is easy to miss is that "$@" needs to be quoted, it seems. $@ is not enough.
@miracle2k Correct. Unquoted, $@ and $* work identically.
@Matt That is something entirely different. "$@" is special in that it quotes each argument separately. It can result in more than one argument thus. "$something" is just quotes around whatever $something expands to and will always be a single argument.
The answer only works for me if I set IFS=$'\n'. No idea why.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.