Подтвердить что ты не робот

Почему ${@: - 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
4b9b3361

Ответ 1

${parameter:-word} - это тип расширения :

${parameter:-word}

Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.


Итак, ${@:-1} интерпретируется как:

Поскольку последнее верно, echo печатает [email protected] во всей красе


Исправление:

Поместите пробел между : и -:

$ echo ${@: -1}
f

Ответ 2

В качестве альтернативного синтаксиса пространства, предложенного Zaid, вы также можете использовать круглые скобки, чтобы получить нужную функциональность:

echo ${@:(-1)}

f

Ответ 3

Некоторые объяснения

Взгляните в разделе Расширение параметров в 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