$1是第一个参数。 $@是全部。
如何找到传递给shell的最后一个参数 脚本?
$1是第一个参数。 $@是全部。
如何找到传递给shell的最后一个参数 脚本?
当前回答
$ set quick brown fox jumps
$ echo ${*: -1:1} # last argument
jumps
$ echo ${*: -1} # or simply
jumps
$ echo ${*: -2:1} # next to last
fox
空格是必要的,这样它就不会被解释为默认值。
注意,这是bash专用的。
其他回答
如果你想以一种非破坏性的方式来做,一种方法是将所有的参数传递给一个函数,并返回最后一个:
#!/bin/bash
last() {
if [[ $# -ne 0 ]] ; then
shift $(expr $# - 1)
echo "$1"
#else
#do something when no arguments
fi
}
lastvar=$(last "$@")
echo $lastvar
echo "$@"
pax> ./qq.sh 1 2 3 a b
b
1 2 3 a b
如果你实际上不关心保留其他参数,你不需要在函数中使用它,但我很难想出一种情况,你永远不会想要保留其他参数,除非它们已经被处理了,在这种情况下,我会使用process/shift/process/shift/…顺序处理它们的方法。
我假设你想保留它们因为你没有遵循顺序法。此方法还处理没有参数的情况,返回""。您可以通过插入注释掉的else子句轻松地调整这种行为。
这是复制函数的一部分:
eval echo $(echo '$'"$#")
要在脚本中使用,请这样做:
a=$(eval echo $(echo '$'"$#"))
解释(最嵌套的先):
$(echo '$'"$#")返回$[nr],其中[nr]是参数的个数。例如字符串$123(未展开)。 Echo $123返回第123个参数的值。 Eval只是将$123扩展为参数的值,例如last_arg。它被解释为一个字符串并返回。
从2015年年中开始使用Bash。
对于bash,这条注释建议非常优雅:
echo "${@:$#}"
静音shellcheck,使用:
echo ${*:$#}
作为奖励,两者都可以在zsh中工作。
以下是我的解决方案:
相当可移植(所有POSIX sh, bash, ksh, zsh)应该工作 不移位原始参数(移位副本)。 不使用恶eval 不是遍历整个列表 不使用外部工具
代码:
ntharg() {
shift $1
printf '%s\n' "$1"
}
LAST_ARG=`ntharg $# "$@"`
对于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