获取传递给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是最后一个。