获取传递给shell脚本的最后一个参数

$1是第一个参数。
$@就是全部。

我怎样才能find传递给shell脚本的最后一个参数?

这是一个黑客:

 for last; do true; done echo $last 

这个也是非常便携的(同样,应该使用bash,ksh和sh),它不会改变参数,这可能是很好的。

它使用这样一个事实,如果你不告诉它循环什么,那么对于参数的隐式循环,以及循环variables没有作用域的事实:它们保持它们被设置的最后一个值。

这是Bash专用的:

 echo "${@: -1}" 

对于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 
 $ set quick brown fox jumps $ echo ${*: -1:1} # last argument jumps $ echo ${*: -1} # or simply jumps $ echo ${*: -2:1} # next to last fox 

该空间是必要的,以便它不被解释为默认值 。

使用索引结合以下长度:

 echo ${@:${#@}} 

当从最后一个参数中分离出来的时候发现了这个问题。 虽然有些答案确实得到了最后一个论点,但是如果你还需要其他的参数,它们也没什么帮助。 这工作好多了:

 heads=${@:1:$(($# - 1))} tail=${@:$#} 

以下将为你工作。 @是用于参数数组的。 :意思是。 $#是参数数组的长度。 所以结果是最后一个元素:

 ${@:$#} 

例:

 function afunction{ echo ${@:$#} } afunction -d -o local 50 #Outputs 50 

这适用于所有与POSIX兼容的shell:

 eval last=\${$#} 

资料来源: http : //www.faqs.org/faqs/unix-faq/faq/part2/section-12.html

如果你使用Bash> = 3.0

 echo ${BASH_ARGV[0]} 

这是我的解决scheme:

  • 相当便携(所有的POSIX sh,bash,ksh,zsh)应该可以工作
  • 不移动原始参数(移动副本)。
  • 不使用邪恶的 eval
  • 不遍历整个列表
  • 不使用外部工具

码:

 ntharg() { shift $1 echo $1 } LAST_ARG=`ntharg $# "$@"` 
 shift `expr $# - 1` echo "$1" 

这将参数的数量减1,并返回第一个(也是唯一的)剩余的参数,这将是最后一个。

我只testingbash,但它应该在sh和ksh中工作。

如果你想以非破坏性的方式做到这一点,一种方法是将所有parameter passing给一个函数,并返回最后一个:

 #!/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 ab b 1 2 3 ab 

如果你实际上不关心保留其他论点,你不需要它在一个函数中,但是我很难想象一个情况,除非它们已经被处理,否则你将永远不想保留其他论点,在这种情况下,我会使用顺序处理它们的process / shift / process / shift / …方法。

我假设你想保留它们,因为你没有遵循顺序方法。 这个方法也处理没有参数的情况,返回“”。 您可以通过插入注释掉的else子句轻松地调整该行为。

对于tcsh:

 set X = `echo $* | awk -F " " '{print $NF}'` somecommand "$X" 

我很肯定这将是一个便携式的解决scheme,除了作业。

在阅读了上面的答案之后,我写了一个Q&D shell脚本(应该在sh和bash上工作)在PGM.cpp上运行g ++来生成可执行映像PGM。 它假设命令行上的最后一个参数是文件名(.cpp是可选的),其他所有参数都是选项。

 #!/bin/sh if [ $# -lt 1 ] then echo "Usage: `basename $0` [opt] pgm runs g++ to compile pgm[.cpp] into pgm" exit 2 fi OPT= PGM= # PGM is the last argument, all others are considered options for F; do OPT="$OPT $PGM"; PGM=$F; done DIR=`dirname $PGM` PGM=`basename $PGM .cpp` # put -o first so it can be overridden by -o specified in OPT set -x g++ -o $DIR/$PGM $OPT $DIR/$PGM.cpp 
 echo $argv[$#argv] 

现在我只需要添加一些文字,因为我的答案太短,无法发布。 我需要添加更多的文字来编辑。

我发现@ AgileZebra的回答(加上@ starfry的评论)是最有用的,但是它将heads设置为一个标量。 一个数组可能更有用:

 heads=( "${@:1:$(($# - 1))}" ) tail=${@:${#@}} 
 #! /bin/sh next=$1 while [ -n "${next}" ] ; do last=$next shift next=$1 done echo $last 

使用eval的解决scheme:

 last=$(eval "echo \$$#") echo $last 

以下将在不改变当前环境的情况下将LAST设置为最后一个参数:

 LAST=$({ shift $(($#-1)) echo $1 }) echo $LAST 

如果其他参数不再需要,可以被移动,可以简化为:

 shift $(($#-1)) echo $1 

出于以下便携性原因:

 shift $(($#-1)); 

可以replace为:

 shift `expr $# - 1` 

用反引号replace$() ,我们得到:

 LAST=`{ shift \`expr $# - 1\` echo $1 }` echo $LAST 

这是我的复制function的一部分:

 eval echo $(echo '$'"$#") 

要在脚本中使用,请执行以下操作:

 a=$(eval echo $(echo '$'"$#")) 

说明(最先嵌套):

  1. $(echo '$'"$#")返回$[nr] ,其中[nr]是参数的数量。 例如string$123 (未扩展)。
  2. 当评估时, echo $123返回123rd参数的值。
  3. eval只是将$123扩展到参数的值,例如last_arg 。 这被解释为一个string,并返回。

与2015年中期的Bash合作。

尝试下面的脚本来find最后一个参数

  # cat arguments.sh #!/bin/bash if [ $# -eq 0 ] then echo "No Arguments supplied" else echo $* > .ags sed -e 's/ /\n/g' .ags | tac | head -n1 > .ga echo "Last Argument is: `cat .ga`" fi 

输出:

  # ./arguments.sh No Arguments supplied # ./arguments.sh testing for the last argument value Last Argument is: value 

谢谢。

有一个更简洁的方法来做到这一点。 一个bash脚本的参数可以放入一个数组中,这使得元素的处理变得更简单。 下面的脚本将始终打印传递给脚本的最后一个参数。

  argArray=( "$@" ) # Add all script arguments to argArray arrayLength=${#argArray[@]} # Get the length of the array lastArg=$((arrayLength - 1)) # Arrays are zero based, so last arg is -1 echo ${argArray[$lastArg]} 

示例输出

 $ ./lastarg.sh 1 2 buckle my shoe shoe 

这种格式可以在Slackware和Cygwin中使用。

“$ {x [@]:( – 1)}”,如果与$ @一起使用,则“$ {@:( – 1)}”

它的意思是:$ {@ 🙁 N)},将返回N个索引后的所有元素(包括N),-1是最后一个。