$@에 매개변수를 어떻게 추가하나요?

$@에 매개변수를 어떻게 추가하나요?

... && add-arg 'something'나는 역과 같은 위치 매개변수에 "무언가"를 추가할 수 있기를 원합니다 shift.

나는 그것을 시도했지만 ... && set "$@ something"그것은 작동하지 않습니다. 비록 set "$@ something"조건 없이 단지 그것을 하는 것만으로도 잘 작동하는 것 같습니다.

답변1

모든 POSIX 쉘에서,

set -- "$@" "value"

value위치 인수 목록의 끝에 추가됩니다 (실제로 목록을 새롭고 긴 목록으로 대체합니다).

set -- "value" "$@"

처음에 추가합니다(기술적으로는 첫 번째 요소가 제거되므로 shifta 와 반대입니다 ). shift이는 에 적용됩니다 zsh.

--다음 값이 로 시작하는 경우 실수로 옵션으로 해석되는 것을 방지하는 데 사용됩니다 -.

특수 변수는 개별적으로 참조되는 각 위치 인수의 값으로 확장되므로 $@거의 독점적으로 사용됩니다 . "$@"표현식은 "$@ somethingelse"개별적으로 인용된 위치 인수 목록으로 확장되어 <space>somethingelse마지막 인수에 추가됩니다.

위치 매개변수의 값을 다음과 같이 사용합니다.단일 문자열공백(또는 첫 번째 문자 $IFS) 으로 구분하여 "$*"( "$* somethingelse"단일 문자열로 잘 정의됨)을 사용하세요. 그러나 이것은아니요이 경우 당신이 원하는 것은 값 목록을 단일 값으로 축소하는 것입니다.

답변2

구체적 zsh으로 추가적으로set -- "$@" ...@Kusalananda가 표시한 기준을 충족합니다., 위치 매개변수는 배열을 통해서도 사용할 수 있으므로 $argv (csh에서와 마찬가지로) 다음과 같이 할 수도 있습니다.

argv+=arg             # append one argument to the end
argv+=(arg2 arg3)     # append several arguments
argv[1,0]=(arg1 arg2) # insert in front
argv[3,0]=(x)         # insert before the 3rd element
2+=(x)                # same as above (insert after the 2nd)
2+=x                  # append x to the second argument (not to confuse with
                      # the above).
argv[2,5]=(y)         # replace 4 elements 2 to 5 with one y argument
argv[3,-1]=()         # truncate
1=()                  # same as "shift"

관련 정보