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

如何找到传递给shell的最后一个参数 脚本?


当前回答

这是复制函数的一部分:

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

要在脚本中使用,请这样做:

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

解释(最嵌套的先):

$(echo '$'"$#")返回$[nr],其中[nr]是参数的个数。例如字符串$123(未展开)。 Echo $123返回第123个参数的值。 Eval只是将$123扩展为参数的值,例如last_arg。它被解释为一个字符串并返回。

从2015年年中开始使用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子句轻松地调整这种行为。

这是一个小hack:

for last; do true; done
echo $last

这也是非常可移植的(同样,应该与bash、ksh和sh一起工作),并且它不改变参数,这可能很好。

它利用了这样一个事实:如果你不告诉它循环什么,for会隐式地遍历参数,而且for循环变量没有作用域:它们保持它们设置的最后一个值。

尝试下面的脚本找到最后一个参数

 # 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

谢谢。

下面将在不改变当前环境的情况下将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

这适用于所有posix兼容的shell:

eval last=\${$#}

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