$1是第一个参数。 $@是全部。
如何找到传递给shell的最后一个参数 脚本?
$1是第一个参数。 $@是全部。
如何找到传递给shell的最后一个参数 脚本?
当前回答
对于bash 3.0或更高版本,最简单的答案是
_last=${!#} # *indirect reference* to the $# variable
# or
_last=$BASH_ARGV # official built-in (but takes more typing :)
就是这样。
$ cat lastarg
#!/bin/bash
# echo the last arg given:
_last=${!#}
echo $_last
_last=$BASH_ARGV
echo $_last
for x; do
echo $x
done
输出是:
$ lastarg 1 2 3 4 "5 6 7"
5 6 7
5 6 7
1
2
3
4
5 6 7
其他回答
对于bash,这条注释建议非常优雅:
echo "${@:$#}"
静音shellcheck,使用:
echo ${*:$#}
作为奖励,两者都可以在zsh中工作。
shift `expr $# - 1`
echo "$1"
这将参数移位为参数的数量减1,并返回第一个(也是唯一一个)剩余的参数,这将是最后一个参数。
我只在bash中测试,但它应该也能在sh和ksh中工作。
我发现@AgileZebra的答案(加上@starfry的评论)最有用,但它将头设置为一个标量。数组可能更有用:
heads=( "${@: 1: $# - 1}" )
tail=${@:${#@}}
注意,这是bash专用的。
编辑:根据@f-hauri的评论删除了不必要的$(())。
这是一个小hack:
for last; do true; done
echo $last
这也是非常可移植的(同样,应该与bash、ksh和sh一起工作),并且它不改变参数,这可能很好。
它利用了这样一个事实:如果你不告诉它循环什么,for会隐式地遍历参数,而且for循环变量没有作用域:它们保持它们设置的最后一个值。
下面将在不改变当前环境的情况下将LAST设置为最后一个参数:
LAST=$({
shift $(($#-1))
echo $1
})
echo $LAST
如果其他参数不再需要并且可以被转移,则可以简化为:
shift $(($#-1))
echo $1
出于便携性的考虑:
shift $(($#-1));
可替换为:
shift `expr $# - 1`
同样用反引号替换$(),我们得到:
LAST=`{
shift \`expr $# - 1\`
echo $1
}`
echo $LAST