명령의 매개변수를 스크립트로 전송하기 위해 두 개의 변수($@, $*)를 사용하는 목적은 무엇입니까? [복사]

명령의 매개변수를 스크립트로 전송하기 위해 두 개의 변수($@, $*)를 사용하는 목적은 무엇입니까? [복사]

에서 사용되는 스크립트 $@와 특수 변수를 읽었습니다 $*. 내가 이해한 바로는 스크립트를 실행할 때 사용되는 매개변수는 $@모든 매개변수가 에 있으면 $*스크립트 내에서 액세스할 수 있도록 두 개의 특수 변수에 저장됩니다.

동일한 매개변수 세트에 대해 왜 두 개의 특수 변수가 있어야 하는지 이해할 수 없습니다. 하나의 특수 변수를 사용할 때와 다른 특수 변수를 사용할 때의 차이점은 무엇입니까?

여기에 이미지 설명을 입력하세요.

답변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

특수 매개변수 $* 및 $@:

모든 명령줄 매개변수에 한 번에 액세스할 수 있는 특수 매개변수가 있습니다. $* 및 $@는 큰따옴표 ""로 묶이지 않는 한 동일한 효과를 갖습니다.

두 매개변수 모두 모든 명령줄 매개변수를 지정하지만 "$*" 특수 매개변수는 전체 목록을 공백이 있는 하나의 매개변수로 사용하는 반면, "$@" 특수 매개변수는 전체 목록을 별도의 매개변수로 분할합니다.

$* 또는 $@ 특수 매개변수를 사용하여 쉘 스크립트를 작성하여 알 수 없는 수의 명령줄 인수를 처리할 수 있습니다.

관련 정보