$@와 $*의 차이점은 무엇입니까?

$@와 $*의 차이점은 무엇입니까?

에 따르면이 페이지, $@ 및 $*는 거의 동일한 작업을 수행합니다.

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
  1. 하나가 다른 것보다 선호됩니까?
  2. 동일한 작업을 수행하는 내장 변수가 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개 있는 이유는 무엇입니까?

$*$@, 그러나 "$@"와 는 차이가 없습니다 "$*".

내 답변은 다음에서 볼 수 있습니다.이 게시물어떻게 다른지 확인해보세요.

관련 정보