[pacman-dev] bash argument passing help

Allan McRae allan at archlinux.org
Tue Oct 20 23:30:50 EDT 2009


Aaron Griffin wrote:
> 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
>   

The reason that can not be used in makepkg is the option parsing uses 
"shift" and thus clears the value of $@ as it goes.

Allan




More information about the pacman-dev mailing list