다음과 같은 인수로 다음 스크립트를 실행할 때 arg1 arg2 arg3
:
#!/bin/bash
zenity --entry --text="$@"
zenity는 “arg1″이라는 텍스트를 사용하여 입력 대화 상자를 작성하지만 “arg1 arg2 arg3″이 필요합니다.
다음 스크립트와 같은 변수를 사용하면 입력 텍스트에 대한 모든 인수가 표시됩니다.
#!/bin/bash
text="$@"
zenity --entry --text="$text"
이 스크립트의 차이점은 무엇입니까? $@
첫 번째 인수가 첫 번째 인수로만 대체 되는 이유는 무엇 입니까?
답변
$@
매뉴얼에$*
설명 된대로 개별 단어로 확장됩니다 ( 단일 단어로 확장) . 따라서 당신이 쓸 때bash
zenity --text="$@"
그것은 확장
zenity --text="$1" "$2" "$3"
그러나 쉘 변수 지정은 단어 분할을 거치지 않습니다. bash
설명서의 변수 할당 확장 목록에서 필드 / 워드 분할은 생략되었습니다 . 이 동작은 POSIX 사양 과 일치합니다 . 당신이 쓸 때
text="$@"
변수 text
는 모든 위치 매개 변수를 단일 단어로 가져옵니다 text="$*"
. 실제로, 이것은 변수 할당에서 큰 따옴표가 종종 필요하지 않은 이유입니다. 양자 모두
text=$@
과
text=$*
완벽하게 안전합니다.
그래서,
text=$@
zenity --option="$text"
"$text"
한 단어로 확장되므로 이것이 작동합니다. (가) 있습니다 --option="$@"
단지 일반적인 명령에 대한 인수입니다 zenity
단어 분할은 여기에 있지만 일어나는 이유, 그리고 쉘 변수 할당, text=$@
.
답변
$@
각 단어를 별도의 단어로 확장하여
zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity
$*
한 단어로 확장 하려면 대신 사용하십시오
zenity --entry --text="$*"
어느 것이 될 것인가
zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity