bash에는 특수 변수에 대해 다른 약한 참조 규칙이 있습니까?

bash에는 특수 변수에 대해 다른 약한 참조 규칙이 있습니까?

나는 bash에서 인용의 뉘앙스를 완전히 이해하지 못하는 것 같습니다.

foo.sh번호가 매겨진 매개변수만 출력하는 스크립트가 있습니다 .

#!/bin/bash

i=1
while [ $i -le $# ] ; do
    v=$(eval "echo \$$i")
    echo "$i: $v"
    i=$((i + 1))
done

다음과 같이 사용할 수 있습니다.

me@localhost] ./foo.sh a b c
1: a
2: b
3: c

args변수를 공백이 포함된 값(예: )으로 설정하면 "super nintendo"다음을 사용할 수 있습니다.인용되지 않음Bash가 이를 두 개의 인수로 처리하도록 합니다.

me@localhost] args="super nintendo" ; ./foo.sh $args
1: super
2: nintendo

아니면 내가 사용할 수 있습니다약한 참조(큰따옴표)는 bash에게 이를 단일 인수로 처리하도록 지시하지만 변수를 실제 값으로 확장합니다.

me@localhost] args="super nintendo" ; ./foo.sh "$args"
1: super nintendo

아니면 내가 사용할 수 있습니다강력한 참조(작은따옴표) 문자 그대로 처리합니다.

me@localhost] args="super nintendo" ; ./foo.sh '$args'
1: $args

그러나 특수 변수에 대한 약한 참조는 $@참조가 전혀 없는 것처럼 보입니다. 예를 들어, bar.sh다음은 foo.sh약한 참조를 사용하여 한 번, 참조 없이 한 번, 총 두 번 호출됩니다.

#!/bin/bash

./foo.sh "$@"
./foo.sh $@

이 명령을 호출하면 ./bar.sh a b c두 호출 모두에 대해 동일한 출력이 생성됩니다 foo.sh.

1: a
2: b
3: c
1: a
2: b
3: c

난 무엇인가?예상되는당신이 보는 것은 다음과 같습니다 :

1: a b c
1: a
2: b
3: c

Bash에서 인용할 때 내가 무엇을 놓치고 있나요?

답변1

$@이는 배열이고 배열 참조에 다른 규칙이 있기 때문입니다 .

  • "${array[@]}"또는 "$@"배열의 구성원으로 확장
  • "${array[*]}"또는 "$*"변수의 첫 번째 문자로 연결된 배열 요소로 확장됩니다 $IFS.

여러 매개변수를 사용해 보세요. 그 중 일부에는 공백이 포함되어 있습니다.

./foo.sh 'one two' three

관련 정보