我有一个简单的脚本,其中第一个参数为文件名保留,所有其他可选参数应该传递到脚本的其他部分。
使用谷歌我找到了这个维基,但它提供了一个字面上的例子:
echo "${@: -1}"
我找不到其他工作,比如:
echo "${@:2,1}"
我从终端得到了"错误替换"
问题是什么?除了传递给bash脚本的第一个参数外,我如何处理其他参数?
我有一个简单的脚本,其中第一个参数为文件名保留,所有其他可选参数应该传递到脚本的其他部分。
使用谷歌我找到了这个维基,但它提供了一个字面上的例子:
echo "${@: -1}"
我找不到其他工作,比如:
echo "${@:2,1}"
我从终端得到了"错误替换"
问题是什么?除了传递给bash脚本的第一个参数外,我如何处理其他参数?
用这个:
echo "${@:2}"
语法如下:
echo "${*:2}"
也可以,但不推荐,因为正如@ gordon已经解释过的那样,使用*,它将所有的参数作为一个带空格的参数一起运行,而@保留了它们之间的断点(即使一些参数本身包含空格)。这与echo没有区别,但对于许多其他命令来说很重要。
如果您想要一个在/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
在找别的东西时偶然发现的。 虽然帖子看起来相当旧,但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替换