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

使用谷歌我找到了这个维基,但它提供了一个字面上的例子:

echo "${@: -1}"

我找不到其他工作,比如:

echo "${@:2,1}"

我从终端得到了"错误替换"

问题是什么?除了传递给bash脚本的第一个参数外,我如何处理其他参数?


当前回答

如果您想要一个在/bin/sh中也可以工作的解决方案,请尝试

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

Shift [n]移动位置参数n次。shift将$1的值设置为$2的值,将$2的值设置为$3的值,依此类推,将$#的值减少1。

其他回答

用这个:

echo "${@:2}"

语法如下:

echo "${*:2}"

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

在找别的东西时偶然发现的。 虽然帖子看起来相当旧,但bash中最简单的解决方案如下所示(至少是bash 4),使用set——"${@:#}",其中#是我们想要向前保留的数组元素的起始号:

    #!/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一样取出数组中的前两个元素,并保留所有剩余的元素,包括第三个元素。我怀疑还有一种方法可以去掉最后的元素。

在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为空或未设置, var的值不变。 ${var:+word} var的值不变。

这是描述:Unix / Linux - Shell替换

如果您想要一个在/bin/sh中也可以工作的解决方案,请尝试

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

Shift [n]移动位置参数n次。shift将$1的值设置为$2的值,将$2的值设置为$3的值,依此类推,将$#的值减少1。

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

它解释了shift的使用(如果您想放弃前N个参数),然后实现Mass Usage