~에 따르면이 페이지, $@ 및 $*는 거의 동일한 작업을 수행합니다.
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
- 하나가 다른 것보다 더 선호됩니까?
- 동일한 기능을 수행하는 내장 변수가 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개 있는 이유는 무엇입니까?
$*
와 사이에는 차이가 없지만 $@
, 가지고 있는 "$@"
것과 "$*"
가지고 있는 것 사이에는 차이가 없습니다.
내 답변을 볼 수 있습니다.이 게시물그들이 어떻게 다른지 확인하십시오.