将命令行参数传递给Shell脚本中的程序


15

至于./script.sh arg1 [arg2 arg3 ...],命令行参数arg1arg2......可以得到通过$1$2...,但是参数的数目是固定的。

在shell脚本中,我想将参数从arg2传递给程序,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

由于可能存在一个或多个参数,我该怎么办?

Answers:


17

通常的方法是保存arg1"$1")的副本并将参数移动一个,因此可以将整个列表引用为"$@"

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash当然有一些数组支持,但是对于提出的问题并不需要它。

如果arg1是可选的,则应按以下方式进行检查:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

使用时是否需要双引号$@
李李

1
双引号与$@告诉外壳将每个参数双引号(如果参数包含有趣的字符(例如括号或星号),则可以做得很好。如果您不在乎,那么简单就行了$*……
Thomas Dickey

6
@李是的,必须使用双引号。否则,不通过参数列表,而是在空格处分割每个参数,然后将每个部分解释为通配符模式,如果该模式匹配,则将其替换为匹配列表。通常来说,总是将双引号变量替换
吉尔(Gilles)“所以

10

您可以使用参数扩展来切片位置参数。语法为:

${parameter:offset:length}

如果length省略,则将其视为最后一个值。

从第二个参数传递到最后一个参数时,您需要:

${@:2}

例:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.