Сопоставьте исходное значение &
, затем все символы, которые не являются хвостами ;
, а затем эти хвосты ;
, например, так: &[^;]+;
Если не совпадают числа (как показано в вашем примере с \D
), требование, добавьте числа к отрицательному набору символов: [^;0-9]
Чтобы заменить все вхождения, добавьте глобальный флаг g
. Сайт regexr.com - удобный инструмент для создания регулярных выражений.
Редактировать: Извините, я изначально неправильно прочитал ваш вопрос.
Это что-то вроде хака:
for last; do true; done
echo $last
Этот также довольно переносимый (опять же, должен работать с bash, ksh и sh), и он не меняет аргументы, что может
Он использует тот факт, что for
неявно перебирает аргументы, если вы не говорите, что перебирать в цикле, и тот факт, что переменные цикла for не имеют области видимости: они сохраняют последнее значение, на которое они были установлены.
Решение с использованием eval
:
last=$(eval "echo \$$#")
echo $last
shift `expr $# - 1`
echo "$1"
Это сдвигает аргументы на количество аргументов минус 1 и возвращает первый (и единственный) оставшийся аргумент, который будет последним.
Я тестировал только в bash, но он также должен работать в sh и ksh.
Если вы хотите сделать это неразрушающим способом, один из способов - передать все аргументы функции и вернуть последний:
#!/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
.
Использовать индексирование в сочетании с длиной:
echo ${@:${#@}}
Если вы используете Bash> = 3.0
echo ${BASH_ARGV[0]}
Самый простой ответ для 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
Для возврата последнего аргумента последний раз используемой команды используют специальный параметр:
Для возврата последнего аргумента последний раз используемой команды используют специальный параметр:
[110] В этом экземпляре это будет работать, если это будет использоваться в рамках сценария, прежде чем другая команда была вызвана.
В этом экземпляре это будет работать, если это будет использоваться в рамках сценария, прежде чем другая команда была вызвана.
Просто используйте !$
.
$ mkdir folder
$ cd !$ # will run: cd folder
#! /bin/sh
next=$1
while [ -n "${next}" ] ; do
last=$next
shift
next=$1
done
echo $last