에서 사용되는 스크립트 $@
와 특수 변수를 읽었습니다 $*
. 내가 이해한 바로는 스크립트를 실행할 때 사용되는 매개변수는 $@
모든 매개변수가 에 있으면 $*
스크립트 내에서 액세스할 수 있도록 두 개의 특수 변수에 저장됩니다.
동일한 매개변수 세트에 대해 왜 두 개의 특수 변수가 있어야 하는지 이해할 수 없습니다. 하나의 특수 변수를 사용할 때와 다른 특수 변수를 사용할 때의 차이점은 무엇입니까?
답변1
간단하고 독창적인 설명은 다음과 같습니다.
$*
설정된 모든 매개변수는 문자열입니다( 매개변수는 첫 번째 문자로 구분됨$IFS
).$@
각 매개변수는 서로 다른 문자열입니다(개행 문자로 구분된 매개변수).
에서 man bash
:
* Expands to the positional parameters, starting from one. When the expansion is not within dou‐
ble quotes, each positional parameter expands to a separate word. In contexts where it is per‐
formed, those words are subject to further word splitting and pathname expansion. When the
expansion occurs within double quotes, it expands to a single word with the value of each param‐
eter separated by the first character of the IFS special variable. That is, "$*" is equivalent
to "$1c$2c...", where c is the first character of the value of the IFS variable. If IFS is
unset, the parameters are separated by spaces. If IFS is null, the parameters are joined with‐
out intervening separators.
@ Expands to the positional parameters, starting from one. When the expansion occurs within dou‐
ble quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2"
... If the double-quoted expansion occurs within a word, the expansion of the first parameter
is joined with the beginning part of the original word, and the expansion of the last parameter
is joined with the last part of the original word. When there are no positional parameters,
"$@" and $@ expand to nothing (i.e., they are removed).
답변2
게다가:
"$*"
다음으로 확장"arg1 arg2 arg3 …"
"$@"
다음으로 확장"arg1" "arg2" "arg3" …
따라서 더 "$@"
안전합니다. $*
더 오래되었을 수 있으며 이전 버전과의 호환성을 위해 존재합니다.
답변3
에서 man bash
:
Special Parameters
The shell treats several parameters specially. These parameters may only
be referenced; assignment to them is not allowed.
* Expands to the positional parameters, starting from one. When the
expansion is not within double quotes, each positional parameter
expands to a separate word. In contexts where it is performed,
those words are subject to further word splitting and pathname
expansion. When the expansion occurs within double quotes, it
expands to a single word with the value of each parameter separated
by the first character of the IFS special variable. That is, "$*"
is equivalent to "$1c$2c...", where c is the first character of the
value of the IFS variable. If IFS is unset, the parameters are
separated by spaces. If IFS is null, the parameters are joined
without intervening separators.
@ Expands to the positional parameters, starting from one. When the
expansion occurs within double quotes, each parameter expands to a
separate word. That is, "$@" is equivalent to "$1" "$2" ... If
the double-quoted expansion occurs within a word, the expansion of
the first parameter is joined with the beginning part of the origi‐
nal word, and the expansion of the last parameter is joined with
the last part of the original word. When there are no positional
parameters, "$@" and $@ expand to nothing (i.e., they are removed).
네 가지 경우, 특히 공백이 포함된 매개변수를 비교하세요.
for i in $*; do echo "$i"; done
for i in $@; do echo "$i"; done
for i in "$*"; do echo "$i"; done
for i in "$@"; do echo "$i"; done
답변4
특수 매개변수 $* 및 $@:
모든 명령줄 매개변수에 한 번에 액세스할 수 있는 특수 매개변수가 있습니다. $* 및 $@는 큰따옴표 ""로 묶이지 않는 한 동일한 효과를 갖습니다.
두 매개변수 모두 모든 명령줄 매개변수를 지정하지만 "$*" 특수 매개변수는 전체 목록을 공백이 있는 하나의 매개변수로 사용하는 반면, "$@" 특수 매개변수는 전체 목록을 별도의 매개변수로 분할합니다.
$* 또는 $@ 특수 매개변수를 사용하여 쉘 스크립트를 작성하여 알 수 없는 수의 명령줄 인수를 처리할 수 있습니다.