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

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


当前回答

GNU bash版本>= 3.0:

num=$#                 # get number of arguments
echo "${!num}"         # print last argument

其他回答

echo $argv[$#argv]

现在我只需要添加一些文字,因为我的回答太短了。我需要添加更多的文字来编辑。

使用参数展开(删除匹配的开头):

args="$@"
last=${args##* }

也很容易把所有的都放在最后:

prelast=${args% *}

如果你想以一种非破坏性的方式来做,一种方法是将所有的参数传递给一个函数,并返回最后一个:

#!/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子句轻松地调整这种行为。

#! /bin/sh

next=$1
while [ -n "${next}" ] ; do
  last=$next
  shift
  next=$1
done

echo $last
$ echo "${*: -1}"

这将打印最后一个参数