${ARGS[@]}와 같은 $@에 대한 표준 배열 이름이 있습니까?

${ARGS[@]}와 같은 $@에 대한 표준 배열 이름이 있습니까?

나는 그것이 수정 가능한 것을 원하지 않습니다. 즉, 나는 그것이 그런 것을 가능하게 할 것이라고 기대하지 않지만 ARGS=("${ARGS[@]}")단지 그런 것을 단순화할 뿐입니다 myarray=("${ARGS[@]/--unneeded-argument/}").

--unneeded-argument예는 매개변수 제거를 의미하지 않습니다.이것내가 묻는 이유. 이것은 제가 수년간 생각해 왔지만 명확한 답을 얻지 못한 질문입니다.

답변1

해당하는 "일반 배열"이 없습니다 $@.

하지만 당신은할 수 있는배열과 관련된 많은 시나리오에서 사용됩니다 (그러나 사용자가 요구하는 것과는 @다릅니다 ).${@[@]}코멘트- $@이미 @확장 기능입니다):

$ set 1 2 3
$ array=("$@")
$ echo "${array[0]}"
1
$ echo "${array[1]}"
2
$ myarray=("${@/2/}")
$ echo "${myarray[@]}"
1 3

그러나 마지막 단계의 결과는 정확히 원하는 결과가 아닐 수 있습니다. 배열에는 여전히 세 개의 요소가 있으며 그 중 하나는 비어 있습니다. 교체가 모든 배열 요소에 개별적으로 적용되기 때문입니다.

답변2

"$@""${foo[@]}"위치 매개변수에 대한 효과는 배열 변수에 대한 효과와 동일합니다 foo. Stephen이 말했듯이, 예를 들어 중괄호가 있는 확장에서 @슬라이스 기호 "${@:1:2}"와 동일한 것을 사용할 수 있습니다 "$1" "$2". (두 번째 숫자를 그대로 두면 목록의 나머지 부분, 즉 그 뒤의 모든 위치 인수 "${@:2}"로 확장됩니다 "$2".)

이는 특수 매개변수의 "이름"이 @단순히 $확장을 트리거하는 이전 매개변수인 명명된 변수와 일치합니다. 일반 확장(내부에 인덱싱이나 문자열 작업 없음)의 경우 중괄호는 선택 사항입니다. 따라서 "${@}"와 마찬가지로 의 인덱스가 0이 아닌 1부터 시작하기 때문에 동일한 효과를 "$@"쓸 수도 있습니다 ."${@:1}"@

하지만 당신은할 수 없다${@[@]}, 또는 을 사용합니다 . 각각 및 ${@[1]}입니다 . (어떤 의미에서는 이미 와 같으 므로 더 이상 인덱싱할 수 없습니다.) 이는 또한 위치 매개변수를 인덱싱하려면 슬라이스 확장을 사용해야 함을 의미합니다 .$@$1$@${args[@]}${@:i:1}.


그러나 배열에 대한 문자열 작업은 @모든 요소에 개별적으로 확장되거나 적용됩니다. 예를 들어, 여기서 세 번째 요소를 제거했지만 oo여전히 남아 있으면 비어 있습니다.foooo@

$ set -- foo bar oo
$ printf ":%s:\n" "${@/oo}"
:f:
:bar:
::

실제로 요소를 제거하려면 값을 반복하여 원하지 않는 요소를 제거하는 등 다른 작업을 수행해야 합니다. 명명된 배열을 사용하면 $@다음과 같이 에서 수행하는 것보다 더 나을 것입니다 .

a=();
for x in "$@"; do
    if [[ $x != oo ]]; then
        a+=("$x");
    fi;
done

또는 이 질문에 대한 (더 나은) 답변:$@에서 위치 매개변수를 제거하는 방법

관련 정보