我有一个简单的脚本,其中第一个参数是为文件名保留的,所有其他可选参数应该传递给脚本的其他部分。
使用Google我找到this wiki,但它提供了一个文字示例:
echo "${@: -1}"
我无法得到任何其他工作,例如:
echo "${@:2}"
或
echo "${@:2,1}"
我从终端获得“不良替代”。
问题是什么,如何处理除传递给bash脚本的第一个参数以外的所有参数?
答案 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的值不变。
答案 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 一样弹出数组中的前两个元素,并保留所有剩余的元素,包括第三个元素。我怀疑还有一种方法可以弹出最后一个元素。