--text="$@"가 첫 번째 단어만 전달하는 이유는 무엇입니까?

--text="$@"가 첫 번째 단어만 전달하는 이유는 무엇입니까?

예를 들어 일부 매개변수를 사용하여 다음 스크립트를 실행할 때 arg1 arg2 arg3:

#!/bin/bash
zenity --entry --text="$@"

zenity는 "arg1"이라는 텍스트가 포함된 입력 대화 상자를 생성합니다. 반면 저는 "arg1 arg2 arg3"을 예상했습니다.

아래 스크립트와 같은 변수를 사용하면 항목 텍스트의 모든 매개변수가 표시됩니다.

#!/bin/bash
text="$@"
zenity --entry --text="$text"

이 스크립트의 차이점은 무엇입니까? 첫 번째 인수가 $@첫 번째 인수로만 대체되는 이유는 무엇입니까?

답변1

$@에 설명된 대로 별도의 단어로 확장하고 $*단일 단어로 확장합니다.bash수동. 그래서 글을 쓸 때

zenity --text="$@"

그것은 확장된다

zenity --text="$1" "$2" "$3"

그러나 쉘 변수 할당은 토큰화되지 않습니다. 확장된 변수 할당 목록에서는 필드/단어 분할이 생략되었습니다.bash수동. 이 동작은 다음과 일치합니다.POSIX 사양. 그래서 글을 쓸 때

text="$@"

변수는 text모든 위치 인수를 단일 단어로 가져옵니다 text="$*". 이는 실제로 변수 할당에 큰따옴표가 필요하지 않은 이유입니다. 둘 다

text=$@

그리고

text=$*

완전히 안전합니다.

그래서,

text=$@
zenity --option="$text"

"$text"단일 단어로 확장 되므로 작동합니다. --option="$@"이는 쉘 변수 할당이 아닌 명령에 대한 일반적인 인수일 뿐이므로 단어 zenity분리가 에서 발생하지 않고 여기에서 발생하는 이유입니다 text=$@.

답변2

$@각 인수를 별도의 단어로 확장하여

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

$*한 단어로 확장하려면 반대를 사용하세요 .

zenity --entry --text="$*"

이것이 될 것이다

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

관련 정보