"$@"과 "$@[@]"의 상대적 장점에 대해

"$@"과 "$@[@]"의 상대적 장점에 대해

인수를 다른 다운스트림 "호출 가능"(바이너리, 스크립트, 함수 등)에 "전달"해야 하는 스크립트(또는 함수)를 작성할 때마다 foo다음과 같이 인수를 전달하는 코드를 작성합니다.

foo "$@"

...하지만 이 대안도 본 적이 있습니다

foo "$@[@]"

zsh나는 이 두 가지 방법이 서로 다른 결과를 생성하지만 성공하지 못하는 시나리오를 만들려고 노력했습니다(적어도 성공하지 못했습니다).

정말 동의어인가요? 그렇지 않다면 사람들은 언제 다른 형태보다 한 형태를 선호합니까?


zsh(저는 이것이 일상적인 쉘인 상황에 주로 관심이 있지만 직장에서는 스크립트를 작성해야 하는 경우가 많기 때문에 bash이 질문에 대한 답변도 궁금합니다.)bash

답변1

"$@"Bourne Shell(1979)의 발명품입니다. 이는 마치 입력한 것처럼 위치 인수 목록으로 확장된다는 의미입니다 "$1" "$2" "$3"....

David Korn은 1980년대 초에 배열 지원을 추가했을 때 구문을 사용하여 개념을 배열로 확장했습니다 "${array[@]}". 더 짧은 형식 zsh도 지원됩니다 ."$array[@]"

"$@"$1배열과 약간 유사하지만 zsh또는 를 제외하고 yash완전히 동일하지는 않은 위치 매개변수(처음부터)를 나타냅니다 . 하나는 $@인덱스 1에서 시작하고 다른 배열은 0에서 시작 ksh합니다 bash. 또는 에서는 작동하지 않습니다 ${@[@]}.kshbash

유일한 "${@[@]}"유효한 쉘은 zsh및 입니다 yash. 작동하는 zsh유일한 것입니다 "$@[@]". 표준 이상으로 사용하는 것은 의미가 없습니다 "$@". 더 유용한 설명은 다음과 같습니다. "$@[1,3]"처음 3개의 위치 매개변수를 가져옵니다.

배열과 유사한 구문을 사용하려면 zsh( // 와 "$argv[@]"같은 $argv위치 매개변수를 참조하는 배열 csh)에서 사용할 수 있습니다.tcshfish

관련 정보