Pass command line parameters to a program inside the shell script
Solution 1
The usual way would be to save a copy of arg1 ("$1"
) and shift the parameters by one, so you can refer to the whole list as "$@"
:
#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"
bash has some array support of course, but it is not needed for the question as posed.
If even arg1 is optional, you would check for it like this:
if [ $# != 0 ]
then
arg1="$1"
shift 1
fi
Solution 2
You can slice the positional parameters using parameter expansion. The syntax is:
${parameter:offset:length}
If length
is omitted it is taken as till the last value.
As you were to pass from second to last arguments, you need:
${@:2}
Example:
$ foo() { echo "${@:2}" ;}
$ foo bar spam egg
spam egg
Related videos on Youtube
ddzzbbwwmm
Updated on September 18, 2022Comments
-
ddzzbbwwmm almost 2 years
As for
./script.sh arg1 [arg2 arg3 ...]
, the command line argumentsarg1
,arg2
, ... can be got by$1
,$2
, ... But the number of arguments is NOT fixed.In the shell script, I want to pass the arguments starting from
arg2
to a program,#/bin/bash ... /path/to/a/program [I want to pass arg2 arg3 ... to the program] ...
How could I do it since there could be one or more arguments?
-
Marius almost 8 yearsThe double-quotes with
$@
tells the shell to double-quote each parameter (something nice to do if the parameters contain interesting characters such as parentheses or asterisks). If you don't care about that, a plain$*
works... -
Gilles 'SO- stop being evil' almost 8 years@Lee Yes, the double quotes are necessary. Otherwise, instead of passing through the list of arguments, each argument is split at whitespace, then each piece is interpreted as a wildcard pattern and, if the pattern matches, it's replaced by the list of matches. Generally, speaking, always double quote variable substitutions.