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

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

使用谷歌我发现这个维基,但它提供了一个文字示例:

echo "${@: -1}"

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

echo "${@:2,1}"

我得到了“糟糕的替换”;在终点站。

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

250691 次浏览

用这个:

echo "${@:2}"

语法如下:

echo "${*:2}"

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

如果你想要一个解决方案,也可以在/bin/sh尝试

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

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

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

它解释了使用shift(如果您想放弃前N个参数)和实施大规模使用

在寻找其他东西时遇到了这个。 虽然这篇文章看起来相当旧,但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的转变一样,并保留所有剩余的元素,包括第三个元素。我怀疑还有一种方法可以去掉最后的元素。

在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为空或未设置,
$ {var:词}

. word替换var, var的值不变

$ {var: +字}如果设置var,

. word替换var, var的值不变

Unix / Linux - Shell替换