Получение последнего аргумента, переданного в сценарий оболочки - PullRequest
244 голосов
/ 06 декабря 2009

$1 - первый аргумент.
$@ это все из них.

Как мне найти последний аргумент, переданный в оболочку сценарий

Ответы [ 26 ]

272 голосов
/ 06 декабря 2009

Это только для Bash:

echo "${@: -1}"
161 голосов
/ 06 декабря 2009

Это что-то вроде хака:

for last; do true; done
echo $last

Этот также довольно переносим (опять же, должен работать с bash, ksh и sh) и не сдвигает аргументы, что может быть неплохо.

Используется тот факт, что for неявно зацикливается на аргументах, если вы не говорите ему, что зацикливаться, и тот факт, что переменные цикла не имеют области видимости: они сохраняют последнее установленное значение.

75 голосов
/ 27 июня 2012
$ set quick brown fox jumps

$ echo ${*: -1:1} # last argument
jumps

$ echo ${*: -1} # or simply
jumps

$ echo ${*: -2:1} # next to last
fox

Пространство необходимо, чтобы оно не интерпретировалось как значение по умолчанию .

73 голосов
/ 13 марта 2010

Самый простой ответ для 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
27 голосов
/ 06 декабря 2009

Используйте индексирование в сочетании с длиной:

echo ${@:${#@}} 
26 голосов
/ 02 июня 2016

Следующее будет работать для вас. @ Для массива аргументов. : означает в. $ # - длина массива аргументов. Таким образом, результатом является последний элемент:

${@:$#} 

Пример:

function afunction{
    echo ${@:$#} 
}
afunction -d -o local 50
#Outputs 50
22 голосов
/ 31 марта 2011

Нашел это, когда пытался отделить последний аргумент от всех предыдущих. Хотя некоторые ответы получают последний аргумент, они не сильно помогают, если вам нужны и все остальные аргументы. Это работает намного лучше:

heads=${@:1:$(($# - 1))}
tail=${@:$#}
19 голосов
/ 15 января 2012

Работает во всех POSIX-совместимых оболочках:

eval last=\${$#}

Источник: http://www.faqs.org/faqs/unix-faq/faq/part2/section-12.html

10 голосов
/ 01 февраля 2013

Вот мое решение:

  • довольно портативный (все POSIX sh, bash, ksh, zsh) должен работать
  • не сдвигает исходные аргументы (сдвигает копию).
  • не использует зло eval
  • не перебирает весь список
  • не использует внешние инструменты

Код:

ntharg() {
    shift $1
    printf '%s\n' "$1"
}
LAST_ARG=`ntharg $# "$@"`
8 голосов
/ 06 декабря 2009

Если вы используете Bash> = 3.0

echo ${BASH_ARGV[0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...