에 따르면이 페이지, $@ 및 $*는 거의 동일한 작업을 수행합니다.
The $@ holds list of all arguments passed to the script.
The $* holds list of all arguments passed to the script.
Google에서 가장 인기 있는 항목을 모두 검색한 후에도 중복된 것처럼 보이는 구문이 2개 있는 이유에 대한 설명을 찾을 수 없습니다.
내 스크립트에서도 동일하게 작동하는 것 같습니다.
cat foo.sh
#!/bin/bash
echo The parameters passed in are $@
echo The parameters passed in are $*
./foo.sh herp derp
The parameters passed in are herp derp
The parameters passed in are herp derp
- 하나가 다른 것보다 선호됩니까?
- 동일한 작업을 수행하는 내장 변수가 2개 있는 이유는 무엇입니까?
추가 소스
bash.cyberciti.biz
답변1
그들은 동일하지 않습니다. $*
는 단일 문자열인 반면 는 $@
실제 배열입니다. 차이점을 확인하려면 다음 스크립트를 다음과 같이 실행하세요.
> ./test.sh one two "three four"
스크립트:
#!/bin/bash
echo "Using \"\$*\":"
for a in "$*"; do
echo $a;
done
echo -e "\nUsing \$*:"
for a in $*; do
echo $a;
done
echo -e "\nUsing \"\$@\":"
for a in "$@"; do
echo $a;
done
echo -e "\nUsing \$@:"
for a in $@; do
echo $a;
done
네 가지 경우에 대한 설명과 결과는 다음과 같습니다.
첫 번째 경우 매개변수는 하나의 긴 매개변수로 간주됩니다.인용됨끈:
Using "$*":
one two three four
사례 2(인용되지 않음) - 루프에 의해 문자열이 단어로 분리됩니다 for
.
Using $*:
one
two
three
four
사례 3 - $@의 각 요소를 인용된 문자열로 처리합니다.
Using "$@":
one
two
three four
마지막 경우 - 각 요소를 따옴표가 없는 문자열로 처리하므로 마지막 요소는 다음과 같은 양으로 다시 분할됩니다 for three four
.
Using $@:
one
two
three
four
답변2
차이점은 확장 방법에 있습니다.
$*
모든 요소가 공백(실제로는 첫 번째 문자 $IFS
)으로 구분된 단일 인수로 확장됩니다.
$@
여러 인수로 확장됩니다.
예를 들어
#!/bin/bash
echo "With *:"
for arg in "$*"; do echo "<$arg>"; done
echo
echo "With @:"
for arg in "$@"; do echo "<$arg>"; done
$ /tmp/test.sh 1 2 "3 4"
With *:
<1 2 3 4>
With @:
<1>
<2>
<3 4>
답변3
검토할 수 있습니다.Bash 초보자 가이드자세한 내용은. 분리 방법의 차이만 제외하면 거의 동일한 작업을 수행합니다.
$*
- 하나부터 시작하여 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하면 IFS 특수 변수의 첫 번째 문자로 구분된 각 매개변수의 값을 사용하여 단일 단어로 확장됩니다.
$@
- 하나부터 시작하여 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하면 각 매개변수는 별도의 단어로 확장됩니다.
그러나 기본값을 다른 값으로 설정하지 않으면 IFS
동일하게 보일 수 있습니다.
답변4
하나가 다른 것보다 선호됩니까?
짧은 대답은 입니다 "$@"
.
큰따옴표 없이 사용하면 동일합니다. 이 경우에는 다른 것보다 선호되는 것이 없습니다. 하지만 정확히 무엇을 원하는지 아는 경우를 제외하고는 항상 큰따옴표와 함께 사용하는 것이 좋습니다.
동일한 작업을 수행하는 내장 변수가 2개 있는 이유는 무엇입니까?
$*
와 $@
, 그러나 "$@"
와 는 차이가 없습니다 "$*"
.
내 답변은 다음에서 볼 수 있습니다.이 게시물어떻게 다른지 확인해보세요.