Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

As for ./script.sh arg1 [arg2 arg3 ...], the command line arguments arg1, 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?

share|improve this question
up vote 7 down vote accepted

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
share|improve this answer
    
Is the double quotes necessary when using $@? – Lee yesterday
1  
The 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... – Thomas Dickey yesterday
5  
@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. – Gilles yesterday

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
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.