–text =“$ @”가 첫 단어 만 전달하는 이유는 무엇입니까? 같은 인수로 다음 스크립트를 실행할 때

다음과 같은 인수로 다음 스크립트를 실행할 때 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


답변