Получение последнего аргумента передало сценарию оболочки

Сопоставьте исходное значение &, затем все символы, которые не являются хвостами ;, а затем эти хвосты ;, например, так: &[^;]+; Если не совпадают числа (как показано в вашем примере с \D), требование, добавьте числа к отрицательному набору символов: [^;0-9] Чтобы заменить все вхождения, добавьте глобальный флаг g. Сайт regexr.com - удобный инструмент для создания регулярных выражений.

Редактировать: Извините, я изначально неправильно прочитал ваш вопрос.

259
задан Steven Penny 10 February 2014 в 04:27
поделиться

11 ответов

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

for last; do true; done
echo $last

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

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

167
ответ дан 23 November 2019 в 02:37
поделиться

Решение с использованием eval :

last=$(eval "echo \$$#")

echo $last
1
ответ дан 23 November 2019 в 02:37
поделиться

Это только Bash:

echo "${@: -1}"
282
ответ дан 23 November 2019 в 02:37
поделиться
shift `expr $# - 1`
echo "$1"

Это сдвигает аргументы на количество аргументов минус 1 и возвращает первый (и единственный) оставшийся аргумент, который будет последним.

Я тестировал только в bash, но он также должен работать в sh и ksh.

2
ответ дан 23 November 2019 в 02:37
поделиться

Если вы хотите сделать это неразрушающим способом, один из способов - передать все аргументы функции и вернуть последний:

#!/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 .

2
ответ дан 23 November 2019 в 02:37
поделиться

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

echo ${@:${#@}} 
28
ответ дан 23 November 2019 в 02:37
поделиться

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

echo ${BASH_ARGV[0]}
8
ответ дан 23 November 2019 в 02:37
поделиться

Самый простой ответ для 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
73
ответ дан 23 November 2019 в 02:37
поделиться

Для возврата последнего аргумента последний раз используемой команды используют специальный параметр:

Для возврата последнего аргумента последний раз используемой команды используют специальный параметр:

[110]

В этом экземпляре это будет работать, если это будет использоваться в рамках сценария, прежде чем другая команда была вызвана.

В этом экземпляре это будет работать, если это будет использоваться в рамках сценария, прежде чем другая команда была вызвана.

0
ответ дан 23 November 2019 в 02:37
поделиться

Просто используйте !$.

$ mkdir folder
$ cd !$ # will run: cd folder
0
ответ дан 23 November 2019 в 02:37
поделиться
#! /bin/sh

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

echo $last
0
ответ дан 23 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: