변수 값을 따옴표로 묶는 것과 bash에서 변수 값을 인용하지 않는 것

변수 값을 따옴표로 묶는 것과 bash에서 변수 값을 인용하지 않는 것

내가 이런 일을 할 때 :

x="hi echo hello"

또는

x='hi echo hello'

그러면 x문자열이 포함됩니다 hi echo hello.

하지만 따옴표를 사용하지 않을 때는 다음과 같습니다.

x=hi echo hello

그러면 x문자열이 포함되고 hi명령이 echo hello실행됩니다.


그러나 변수 값이 단일 단어로만 구성된 경우 다음 사이에 차이점이 있습니까?

x="hi"
x='hi'
x=hi

답변1

세상에 대안이 있는 경우에만 가능합니다.

그래서

x=$FRED

다음과 다릅니다:

x='$FRED'

답변2

아니요. 일반적인 문자와 숫자의 의미는 인용 여부에 관계없이 변경되지 않습니다.

추가적으로, 에서 언급한 것처럼이 답변, 확장된 단어 분할 또는 할당을 수행할 때 파일 이름 와일드카드가 발생하지 않으므로 와일드카드는 해당 컨텍스트에서 특별하지 않으며 대부분의 다른 곳과 달리 분할을 호출하지 않고 인용되지 않은 변수를 사용할 수 있습니다. var1=*리터럴 별표를 할당하고 IFS 문자에 관계없이 var2=$var1값을 할당합니다 .var1

다른 특수 문자는 매우 특별합니다.

  • 공백
  • $확장을 위한 백틱 `(@Julian이 지적했듯이)
  • 배열 할당을 위한 괄호(@cas 언급됨) 잘못 배치하면 구문 오류가 발생합니다.
  • !기록 확장, <>|리디렉션, 파이프 ;종료 &\기타 문자 이스케이프에 사용되는 백슬래시입니다.

특별한 의미를 갖지 않도록 하려면 이러한 모든 항목을 인용하거나 이스케이프 처리해야 합니다.

답변3

쉘이 가장 먼저 하는 일은 선을 나누는 것입니다.인용되지 않음공백(메타문자)을 토큰으로 변환합니다. 이는 IFS 값이 다음과 같기 때문에 확장 후 완성된 단어 분할과 다릅니다.아니요사용된. 초기 토큰 분할에 사용되는 문자는 메타 문자로 고정됩니다. 이 모든 것에는 다음이 var포함 됩니다 Hello(간혹 간략하게):

var=Hello echo World       # Space
var=Hello;echo World       # Semicolon
var=Hello   echo World     # Tab
var=Hello&echo World       # Ampersand

또한 이 초기 토큰 분할의 경우 할당의 오른쪽이 참조로 처리됩니다.
다음은 모두 동일합니다.

var="Hello World"
var='Hello World'
var=Hello\ World

캐릭터만 참고해주세요~ 해야 하다인용된 내용이 비어 있습니다. IFS가 수정된 경우에도 마찬가지입니다.

물론 큰따옴표 안에는 다양한 확장이 허용됩니다.

var=~"/"       ;  var=~/         tilde  expansion (outside quotes)
var="$PWD"     ;  var=$PWD       parameter  and variable expansion
var="$(pwd)"   ;  var=$(pwd)     command substitution
var="$((2+3))" ;  var=$((2+3))   arithmetic expansion
var="!$"       ;  var=!$         history substitution

위의 모든 쌍은 동일합니다.

전혀이러한 쌍은 작은따옴표(또는 일부 역따옴표) 안에서 동일한 방식으로 작동합니다. 예를 들면 다음과 같습니다.

var='$PWD'     ;  var=\$PWD

게다가 이게 전부다.아니요동일한:

var="( Hello World )"   ; var=( Hello World )

괄호는 배열 할당을 트리거합니다.


따라서 다음은 모두 동일합니다.

var=hi
var="hi"
var='hi'
var=\hi
var=h\i
var=\h\i

이전에 주어진 특별한 조건을 고려합니다.

관련 정보