处理除第一个之外的所有参数(在bash脚本中)

时间:2012-01-29 22:31:23

标签: bash shell

我有一个简单的脚本,其中第一个参数是为文件名保留的,所有其他可选参数应该传递给脚本的其他部分。

使用Google我找到this wiki,但它提供了一个文字示例:

echo "${@: -1}"

我无法得到任何其他工作,例如:

echo "${@:2}"

echo "${@:2,1}"

我从终端获得“不良替代”。

问题是什么,如何处理除传递给bash脚本的第一个参数以外的所有参数?

5 个答案:

答案 0 :(得分:534)

使用此:

echo "${@:2}"

以下语法:

echo "${*:2}"

也可以,但不推荐,因为正如@Gordon已经解释过的那样,使用*,它将所有参数作为带有空格的单个参数一起运行,而{{1}保留它们之间的中断(即使某些参数本身包含空格)。它与@没有区别,但对许多其他命令来说很重要。

答案 1 :(得分:152)

如果您想要一个也适用于/bin/sh的解决方案,请尝试

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"

shift [n]移位位置参数 n 次。 shift$1的值设置为$2的值,$2的值设置为$3的值,依此类推,减小值$#一个。

答案 2 :(得分:4)

http://wiki.bash-hackers.org/scripting/posparams

它解释了使用shift(如果你想丢弃前N个参数)然后实现批量使用(查找带有该标题的标题)。

答案 3 :(得分:4)

使用bash 4或更高版本:

#!/bin/bash
echo "$0";         #"bash"
bash --version;    #"GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)"

在功能上:

echo $@;              #"p1" "p2" "p3" "p4" "p5"
echo ${@: 0};  #"bash" "p1" "p2" "p3" "p4" "p5"
echo ${@: 1};         #"p1" "p2" "p3" "p4" "p5"
echo ${@: 2};              #"p2" "p3" "p4" "p5"
echo ${@: 2:1};            #"p2"
echo ${@: 2:2};            #"p2" "p3"
echo ${@: -2};                       #"p4" "p5"
echo ${@: -2:1};                     #"p4"

请注意':'和'-'之间的空格,否则表示不同:

$ {var:-word} 如果var为null或未设置,则
用word代替var。 var的值不变。

$ {var:+ word} (如果设置了var,则
用word代替var。 var的值不变。

其中描述如下:Unix / Linux - Shell Substitution

答案 4 :(得分:0)

在此寻找其他东西。 虽然帖子看起来相当老,但下面使用set -- "${@:#}"(至少bash 4)说明了bash中最简单的解决方案,其中#是我们要保留的数组元素的起始编号:

    #!/bin/bash

    someVar="${1}"
    someOtherVar="${2}"
    set -- "${@:3}"
    input=${@}

    [[ "${input[*],,}" == *"someword"* ]] && someNewVar="trigger"

    echo -e "${someVar}\n${someOtherVar}\n${someNewVar}\n\n${@}"

基本上,set -- "${@:3}"会像perl的 shift 一样弹出数组中的前两个元素,并保留所有剩余的元素,包括第三个元素。我怀疑还有一种方法可以弹出最后一个元素。