Bash에서 ${@}는 무엇인가요? [복사]

Bash에서 ${@}는 무엇인가요? [복사]

최근에는 Linux에서 bash 명령, 특히 문자열 작업을 배우고 있습니다. 와 동일하게 선언된 지역 변수가 있습니다 ${@}. 그 뜻 은 이해해요$nN명령에 제공된 명령줄 인수입니다. 하지만 요점은 무엇입니까 ${@}?

주어진 명령은 다음과 같습니다:

local instr;
instr="${@}";

답변1

Bash(및 모든 POSIX 유사 쉘) 에서 $@또는${@}"특수 매개변수"모든 위치 인수(= 명령줄 인수) 목록으로 확장됩니다. $*그것은 비슷하다큰따옴표공백으로 구분된 모든 위치 인수를 포함하는 문자열이 아닌 개별 토큰 목록으로 확장됩니다 (1) .


(1) 실제로 매개변수는 "공백"으로 명시적으로 연결되지 않고 첫 번째 문자( $IFS예:입력 필드 구분 기호변수이지만 많은 쉘에서는 기본값이 "space"입니다. 다음 텍스트에서는 단순함을 위해 "공간"을 계속 사용하고 $IFS기본값을 유지하거나 필요에 따라 변경하지만 무엇을 하려는지 알고 있다고 가정합니다.


그래서,

  • "$*""$1 $2 $3 ... ""단어" 와 동등 하고 간주되는 반면,
  • "$@""$1" "$2" "$3" ..."여러 개별 단어"와 동일하며 취급됩니다.

따옴표가 없으면 둘 다 공백으로 구분된 단어 목록일 뿐입니다. 아래와 같이 명령줄 인수 자체가 공백이 있는 문자열인 경우 이러한 구별이 중요해집니다.

./my_script.sh parameter1 parameter2 "a whole sentence as parameter"
  • $*또는 $@따옴표 없이는 7개의 개별 토큰 목록으로 확장됩니다. 이것은 당신이 원하는 경우가 거의 없습니다.
  • "$*"공백으로 구분된 7개의 단어( ) parameter1 parameter2 a whole sentence as parameter로 구성된 토큰 으로 확장됩니다. 이것은 대부분의 시간입니다아니요당신은 무엇을 원합니까?
  • "$@"3개의 토큰 목록으로 확장됩니다. 처음 두 개는 공백이 포함된 문자열 parameter1이고 parameter2마지막은 공백입니다 . a whole sentence as parameter이는 대부분의 경우, 특히 마커 목록으로 사용하려는 경우(반복, 배열에 할당 또는 사용자 정의 함수에 전달) 필요한 것입니다.

특히 쉘 변수 인용 및 토큰화의 미묘함에 관해 더 자세히 읽으려면 다음을 참조하는 것이 좋습니다.

관련 정보