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


9

다음과 같은 인수로 다음 스크립트를 실행할 때 arg1 arg2 arg3:

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

zenity는 "arg1"이라는 텍스트를 사용하여 입력 대화 상자를 작성하지만 "arg1 arg2 arg3"이 필요합니다.

다음 스크립트와 같은 변수를 사용하면 입력 텍스트에 대한 모든 인수가 표시됩니다.

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

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

답변:


16

$@매뉴얼에$* 설명 된대로 개별 단어로 확장됩니다 ( 단일 단어로 확장) . 따라서 당신이 쓸 때bash

zenity --text="$@"

그것은 확장

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

그러나 쉘 변수 지정은 단어 분할을 거치지 않습니다. bash설명서의 변수 할당 확장 목록에서 필드 / 워드 분할은 생략되었습니다 . 이 동작은 POSIX 사양 과 일치합니다 . 당신이 쓸 때

text="$@"

변수 text는 모든 위치 매개 변수를 단일 단어로 가져옵니다 text="$*". 실제로, 이것은 변수 할당에서 큰 따옴표가 종종 필요하지 않은 이유입니다. 양자 모두

text=$@

text=$*

완벽하게 안전합니다.

그래서,

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

"$text"한 단어로 확장되므로 이것이 작동합니다. (가) 있습니다 --option="$@"단지 일반적인 명령에 대한 인수입니다 zenity단어 분할은 여기에 있지만 일어나는 이유, 그리고 쉘 변수 할당, text=$@.


1
+1. 이것은 또한 작동합니다 : zenity --text="$*"- "$*"한 단어로 확장됩니다.
glenn jackman

나에게 한 가지를 가르쳐 준 +1 : man! = documentation. info bash를 검색 했어야하며 링크 된 수동 섹션도 포함되어 있습니다.
manatwork

7

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

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

$*한 단어로 확장 하려면 대신 사용하십시오

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

어느 것이 될 것인가

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

OP의 질문에서 $ text 변형이 예상대로 작동하는 이유를
밝히십시오.

@ChandraRavoori, 당신은 저를 붙 잡았습니다. "$ @"를 제외하고 단어 분리가 수행되지 않는 단어 및 "큰 따옴표로 묶인 확장이 단어 내에서 발생하는 경우 첫 번째 매개 변수의 확장은 원래 단어의 시작 부분과 결합됩니다. 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 결합한다. "내가 기대 있도록 text="$@"에 확장 할 text="arg1" "arg2" "arg3"실패한다. 그러나 확실히 그렇지 않습니다.
manatwork

@ChandraRavoori 변수 할당에서 필드 분할이 발생하지 않기 때문입니다. 나는 내 대답 에 더 자세히 설명 합니다.
jw013

@ jw013 :하지만에 따라 수동 배쉬 참조 , "$@" 수행 , 단어를 분할받을 경우에도 변수 할당에.
ruakh

@ruakh 배쉬 매뉴얼은 내가 아는 한 그렇게 말하지 않습니다. 당신은 견적이 있습니까?
jw013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.