myFun1
다음 은 myFun2
동일한 출력을 생성하지 않습니다. 왜?
#!/bin/bash
myFun1() {
local item
IFS=:
for item in "${@}"; do
echo "->${item}<-"
done
}
myFun2() {
local items="${@}";
local item
IFS=:
for item in "${items}"; do
echo "->${item}<-"
done
}
옮기다
myFun1 "a=b" "c='d 1'" "e"
생산하다
->a=b<-
->c='d 1'<-
->e<-
하지만
myFun2 "a=b" "c='d 1'" "e"
생산하다
->a=b c='d 1' e<-
답변1
이 행동은POSIX에 의해 정의됨, Bash와 Zsh 모두 이를 준수하기 위해 노력합니다.
@
1부터 시작하는 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하고 필드 분할이 수행되는 경우(필드 분할 참조) 각 위치 인수는 별도의 필드로 확장되어야 합니다.
그러나 이 동작은 $@
자신에게만 적용됩니다. 해당 값을 다른 변수에 할당하면 개별 필드의 의미가 손실되어 단일 문자열(예: 사용한 문자열 $*
)로 처리됩니다.
Zsh에 대해서는 잘 모르겠지만 Bash에서 $@
다른 변수에 저장하고 필드 분리를 활용하려면 배열을 사용해야 합니다.
myFun2() {
local -a items=("${@}");
local item
IFS=:
for item in "${items[@]}"; do
echo "->${item}<-"
done
}
Bash에서 양식의 배열 확장 "${array[@]}"
은 "$@"
.