获取传递给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 '$'"$#")) 
说明(最先嵌套):
-   $(echo '$'"$#")返回$[nr],其中[nr]是参数的数量。 例如string$123(未扩展)。
-  当评估时, echo $123返回123rd参数的值。
-   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是最后一个。