나는 그것이 수정 가능한 것을 원하지 않습니다. 즉, 나는 그것이 그런 것을 가능하게 할 것이라고 기대하지 않지만 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
여전히 남아 있으면 비어 있습니다.foo
oo
@
$ set -- foo bar oo
$ printf ":%s:\n" "${@/oo}"
:f:
:bar:
::
실제로 요소를 제거하려면 값을 반복하여 원하지 않는 요소를 제거하는 등 다른 작업을 수행해야 합니다. 명명된 배열을 사용하면 $@
다음과 같이 에서 수행하는 것보다 더 나을 것입니다 .
a=();
for x in "$@"; do
if [[ $x != oo ]]; then
a+=("$x");
fi;
done
또는 이 질문에 대한 (더 나은) 답변:$@에서 위치 매개변수를 제거하는 방법