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

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

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

The $@ holds list of all arguments passed to the script. 
The $* holds list of all arguments passed to the script.

Google에서 인기 검색어를 모두 검색한 후에도 중복된 것으로 보이는 두 가지 구문이 있는 이유에 대한 설명을 찾을 수 없습니다.

내 스크립트에서도 같은 목적으로 사용되는 것 같습니다.

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 초보자 가이드더 많은 정보를 알고 싶습니다. 그들은 거의 같은 일을 하지만 단지 다르게 분리될 뿐입니다.

$*- 1부터 시작하는 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하면 IFS 특수 변수의 첫 번째 문자로 구분된 각 인수의 값을 사용하여 단일 단어로 확장됩니다.

$@- 1부터 시작하는 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하면 각 인수가 별도의 단어로 확장됩니다.

IFS그러나 기본값이 아닌 다른 것으로 설정하지 않으면 동일하게 보일 수 있습니다 .

답변4

하나가 다른 것보다 더 선호됩니까?

짧은 대답은 입니다 "$@".

큰따옴표 없이 사용하면 동일합니다. 이 상황에서는 어느 누구도 다른 사람보다 선호되지 않습니다. 그러나 원하는 것이 무엇인지 정확히 알지 않는 한 항상 큰따옴표를 사용하는 것이 좋습니다.

동일한 기능을 수행하는 내장 변수가 2개 있는 이유는 무엇입니까?

$*와 사이에는 차이가 없지만 $@, 가지고 있는 "$@"것과 "$*"가지고 있는 것 사이에는 차이가 없습니다.

내 답변을 볼 수 있습니다.이 게시물그들이 어떻게 다른지 확인하십시오.

관련 정보