Почему ${@: - 1} не возвращает последний элемент [email protected]?
Я думал опубликовать Q & A на этом, поскольку я не нашел ничего подобного. Если он уже существует, отметьте это как дубликат.
Следующий код, работающий под оболочкой Bash, не работает (должен возвращать только f
, последний (-1-й) элемент в [email protected]
):
$ set -- a b c d e f
$ echo ${@:-1}
a b c d e f
Ответы
Ответ 1
${parameter:-word}
- это тип расширения :
${parameter:-word}
Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.
Итак, ${@:-1}
интерпретируется как:
Поскольку последнее верно, echo
печатает [email protected]
во всей красе
Исправление:
Поместите пробел между :
и -
:
$ echo ${@: -1}
f
Ответ 2
В качестве альтернативного синтаксиса пространства, предложенного Zaid, вы также можете использовать круглые скобки, чтобы получить нужную функциональность:
echo ${@:(-1)}
f
Ответ 3
Некоторые объяснения
Взгляните в разделе Расширение параметров в bash man page:
-
${parameter:-word}
→ Использовать значения по умолчанию. Если параметр не задан или нулевым, расширение слова заменяется... -
${parameter:=word}
→ Назначить значения по умолчанию. Если параметр не задан или нулевым, расширение слова присваивается параметру... -
${parameter:?word}
→ Отобразить ошибку, если Null или Unset. Если параметр равен null или unset, расширение слова записывается в стандартную ошибку и оболочку,... - ...
Ну, синтаксис ${@:-1}
вернет 1
, если [email protected]
пуст...
echo ${@:-1}
a b c d e f
set --
echo ${@:-1}
1
echo ${@:-It is.}
It is.
Работа вокруг может быть выполнена с помощью чего-либо, что нарушает синтаксис :-
.
set -- alpha beta ceta delta enigma foo
echo ${@: -1}
foo
echo ${@:0-1}
foo
echo ${@:(-1)}
foo
echo ${@:10#-1}
foo
echo ${@:1*-1}
foo
Все массивы влияют одинаково.
array=(Hello good world)
echo ${array[@]:-1}
Hello good world
echo ${array[@]:0-1}
world