Bash 또는 zsh에서 $@ 이해하기

Bash 또는 zsh에서 $@ 이해하기

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[@]}""$@".

관련 정보