예를 들어 일부 매개변수를 사용하여 다음 스크립트를 실행할 때 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