나는 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