[pacman-dev] bash argument passing help

Aaron Griffin aaronmgriffin at gmail.com
Tue Oct 20 23:28:47 EDT 2009


On Tue, Oct 20, 2009 at 10:17 PM, Dan McGee <dpmcgee at gmail.com> wrote:
> On Tue, Oct 20, 2009 at 9:45 PM, Allan McRae <allan at archlinux.org> wrote:
>> Hi all,
>>
>> This problem has been doing my head in...    First a minimal example that
>> reflects how makepkg does things:
>>
>> --one.sh--
>> #!/bin/bash
>>
>> echo "pass 1:"
>> for arg in "$@"; do
>>  echo $arg
>> done
>> echo
>>
>> ARGLIST="$@"
>>
>> ./two.sh $ARGLIST
>> --end one.sh--
>>
>> --two.sh--
>> #!/bin/bash
>>
>> echo "pass 2:"
>> for arg in "$@"; do
>>  echo $arg
>> done
>> --end two.sh--
>>
>> then run:
>> ./one.sh -f -h "foo bar"
>> pass 1:
>> -f
>> -h
>> foo bar
>>
>> pass 2:
>> -f
>> -h
>> foo
>> bar
>>
>>
>> Note how in pass two, foo and bar are no longer in the one line.   Of
>> course, passing ./two.sh "$@" works, but the argument parsing in makepkg
>> clears that, hence the need to save it to ARGLIST.
>>
>> Any ideas?
>
> Of course! I think I got it.
>
> dmcgee at kilkenny /tmp
> $ ./one.sh -f -h "foo bar"
> pass 1:
> -f
> -h
> foo bar
>
> pass 2:
> -f
> -h
> foo
> bar
>
> dmcgee at kilkenny /tmp
> $ ./one-new.sh -f -h "foo bar"
> pass 1:
> -f
> -h
> foo bar
>
> pass 2:
> -f
> -h
> foo bar
>
> $ cat one-new.sh
> #!/bin/bash
> echo "pass 1:"
> for arg in "$@"; do
>  echo $arg
> done
> echo
>
> ARGLIST=("$@")
>
> ./two.sh "${ARGLIST[@]}"
>
> Do I win a prize or anything? :P

It's worth noting that the following works two:

./two.sh "$@"

The reason being that "$@" is special in bash. It actually expands to
the command line quoted as you passed it, with "foo bar" being one
argument. The issue is with the assignment to a single bash variable


More information about the pacman-dev mailing list