Об относительных достоинствах “ $ @ "` и `" $ @ "`

Всякий раз, когда я пишу скрипт (или функцию), который должен «передавать» свои аргументы некоторым другим «вызываемым» («двоичным», «скрипт», «функциям» и т. Д. »), Я кодирую это прохождение аргументов, подобных этому

 foo "$@" 

… но я также видел эту альтернативу

 foo "$@[@]" 

Я попытался, безуспешно (по крайней мере, с zsh ), придумать сценарии, в которых эти два подхода приведут к различным результатам.

Действительно ли они синонимы? Если нет, когда вы предпочитаете одну форму над другой?


(Меня в первую очередь интересует случай zsh , который является моей повседневной оболочкой, но на работе мне часто приходится писать сценарии bash , поэтому мне будет интересно узнать ответ на этот вопрос и для bash .)

One Solution collect form web for “Об относительных достоинствах “ $ @ "` и `" $ @ "`”

"$@" – изобретение оболочки Bourne (1979). Это означает расширение списка позиционных параметров, как если бы вы набрали "$1" "$2" "$3"...

Когда Дэвид Корн добавил поддержку массива в начале 80-х, он расширил эту концепцию до массивов с помощью синтаксиса "${array[@]}" . zsh также поддерживает "$array[@]" более короткую форму.

"$@" относится к позиционным параметрам (начиная с $1 ), это немного похоже на массив, но за исключением zsh или yash , а не точно. Для одного, $@ начинается с индекса 1, а другие массивы в ksh или bash начинаются с 0. ${@[@]} не будут работать в ksh или bash .

Единственные оболочки, в которых работает "${@[@]}"zsh и yash . zsh является единственным, где работает "$@[@]" . Нет смысла использовать его над стандартным "$@" . Что может быть более полезным, так это сказать: "$@[1,3]" чтобы получить первые 3 позиционных параметра.

Если точкой является то, что вы хотели бы использовать синтаксис типа массива, в zsh вы можете использовать "$argv[@]" ( $argv – это массив, который ссылается на позиционные параметры, например, в csh / tcsh / fish ) ,

  • Глобус с помощью скобок и переменных в zsh
  • Что делает% \ / do (расширение командной строки zsh)?
  • ^ P не работает в zsh, где я должен смотреть?
  • Что делает `zstyle`?
  • Есть ли postexec / predisplay hook для ZSH?
  • Как я могу удалить косую черту или слово в zsh?
  • Сделать zsh alt-f вести себя как emacs alt-f
  • Как это расширение параметра zsh работает?
  • FPATH в zsh: функции и функции сайта
  • zsh: проблемы с переименованием файлов с zmv
  • Определение слова в ZLE (zsh)
  • Linux и Unix - лучшая ОС в мире.