[bash] Bash에서 작은 따옴표와 큰 따옴표의 차이점
Bash에서 작은 따옴표 ( ''
)와 큰 따옴표 ( ""
) 의 차이점은 무엇 입니까?
답변
작은 따옴표는 아무것도 보간하지 않지만 큰 따옴표는 예를 들어 : 변수, 백틱, 특정 \
이스케이프 등
예:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")
Bash 매뉴얼은 다음과 같이 말합니다.
작은 따옴표 (
'
)로 문자를 묶으면 따옴표 안에 각 문자의 리터럴 값이 유지됩니다. 백 슬래시가 앞에 있어도 작은 따옴표 사이에는 작은 따옴표가 없을 수 있습니다.(큰 따옴표 문자를 둘러싸는 것은
"
)을 제외하고, 따옴표 내의 모든 문자의 리터럴 값을 보존$
,`
,\
,와, 역사 확장을 사용하는 경우,!
. 문자$
및`
따옴표 내에서 특별한 의미를 유지합니다 ( 쉘 확장이 ). 다음 문자 중 하나 다음에 할 때 백 슬래시는 특별한 의미를 유지 :$
,`
,"
,\
또는 개행. 큰 따옴표 내에서 이러한 문자 중 하나가 뒤에 오는 백 슬래시가 제거됩니다. 특별한 의미가없는 선행 문자 앞에는 백 슬래시가 수정되지 않습니다. 큰 따옴표는 큰 따옴표 안에 백 슬래시를 붙여 따옴표로 묶을 수 있습니다. 사용 가능한 경우!
큰 따옴표 로 표시되는 백 슬래시를 사용하여 이스케이프 하지 않으면 기록 확장이 수행됩니다 . 앞에있는 백 슬래시!
는 제거되지 않습니다.큰 따옴표로 묶인 경우 특수 매개 변수
*
이며@
특별한 의미가 있습니다 ( 쉘 매개 변수 확장 참조 ).
답변
허용 대답은 중대하다. 주제를 빠르게 이해하는 데 도움이되는 표를 만들고 있습니다. 설명에는 간단한 변수 a
와 색인 배열이 포함 arr
됩니다.
설정하면
a=apple # a simple variable
arr=(apple) # an indexed array with a single element
다음 echo
두 번째 열에서 표현, 우리는 세 번째 열에 표시된 결과 / 동작을 얻을 것입니다. 네 번째 열은 동작을 설명합니다.
# | Expression | Result | Comments
---+-------------+-------------+--------------------------------------------------------------------
1 | "$a" | apple | variables are expanded inside ""
2 | '$a' | $a | variables are not expanded inside ''
3 | "'$a'" | 'apple' | '' has no special meaning inside ""
4 | '"$a"' | "$a" | "" is treated literally inside ''
5 | '\'' | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting)
6 | "red$arocks"| red | $arocks does not expand $a; use ${a}rocks to preserve $a
7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $
8 | '\"' | \" | \ has no special meaning inside ''
9 | "\'" | \' | \' is interpreted inside "" but has no significance for '
10 | "\"" | " | \" is interpreted inside ""
11 | "*" | * | glob does not work inside "" or ''
12 | "\t\n" | \t\n | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "`echo hi`" | hi | `` and $() are evaluated inside ""
14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]} | array access not possible inside ''
16 | "${arr[0]}" | apple | array access works inside ""
17 | $'$a\'' | $a' | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'" | $'\t' | ANSI-C quoting is not interpreted inside ""
19 | '!cmd' | !cmd | history expansion character '!' is ignored inside ''
20 | "!cmd" | cmd args | expands to the most recent command matching "cmd"
21 | $'!cmd' | !cmd | history expansion character '!' is ignored inside ANSI-C quotes
---+-------------+-------------+--------------------------------------------------------------------
또한보십시오:
답변
무언가를 반향 할 때 발생하는 상황을 언급하는 경우 작은 따옴표는 문자 사이에있는 것을 문자 그대로 반향하는 반면, 큰 따옴표는 그 사이의 변수를 평가하고 변수의 값을 출력합니다.
예를 들어
#!/bin/sh
MYVAR=sometext
echo "double quotes gives you $MYVAR"
echo 'single quotes gives you $MYVAR'
이것을 줄 것이다 :
double quotes gives you sometext
single quotes gives you $MYVAR
답변
다른 사람들은 매우 잘 설명하고 간단한 예를 제시하고 싶습니다.
쉘이 특수 문자를 해석하지 못하도록 텍스트 주위에 작은 따옴표를 사용할 수 있습니다. 작은 따옴표로 묶으면 달러 기호, 공백, 앰퍼샌드, 별표 및 기타 특수 문자가 모두 무시됩니다.
$ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.'
이것은 이것을 줄 것입니다 :
All sorts of things are ignored in single quotes, like $ & * ; |.
작은 따옴표 안에 넣을 수없는 유일한 것은 작은 따옴표입니다.
따옴표는 따옴표가 여전히 쉘은 달러 기호, 다시 시세 및 백 슬래시를 해석 할 수 제외하고, 작은 따옴표와 유사하게 작동합니다. 백 슬래시는 단일 특수 문자가 해석되는 것을 방지하는 것으로 이미 알려져 있습니다. 변수 대신 달러 기호를 텍스트로 사용해야하는 경우 큰 따옴표 안에 유용 할 수 있습니다. 또한 큰 따옴표를 이스케이프 처리하여 따옴표로 묶은 문자열의 끝으로 해석되지 않습니다.
$ echo "Here's how we can use single ' and double \" quotes within double quotes"
이것은 이것을 줄 것입니다 :
Here's how we can use single ' and double " quotes within double quotes
따옴표로 묶인 문자열의 시작으로 해석되는 아포스트로피는 큰 따옴표 내에서 무시됩니다. 그러나 변수는 큰 따옴표 안에있는 값으로 해석되고 대체됩니다.
$ echo "The current Oracle SID is $ORACLE_SID"
이것은 이것을 줄 것입니다 :
The current Oracle SID is test
역 따옴표 는 전체적으로 작은 따옴표 나 큰 따옴표와 다릅니다. 특수 문자의 해석을 막기 위해 사용되는 대신, 큰 따옴표는 실제로 포함 된 명령을 강제로 실행합니다. 동봉 된 명령이 실행 된 후 출력은 원래 줄의 역 따옴표 대신 대체됩니다. 예를 들어 더 명확해질 것입니다.
$ today=`date '+%A, %B %d, %Y'`
$ echo $today
이것은 이것을 줄 것입니다 :
Monday, September 28, 2015
답변
의 사용 사이에 명확한 구분이 ' '
와 " "
.
' '
무엇이든 사용 하면 “변환 또는 번역”이 수행되지 않습니다. 그대로 인쇄됩니다.
을 사용하면 " "
주변에 무엇이든지 값으로 “번역되거나 변환됩니다”.
번역 / 변환의 의미는 다음과 같습니다. 작은 따옴표 안에있는 것은 그 값으로 “번역”되지 않습니다. 그들은 따옴표 안에있는 그대로 가져갑니다. 예 : a=23
그런 다음 표준 출력 echo '$a'
을 생성 $a
합니다. 반면 표준 출력으로 echo "$a"
생산 23
됩니다.
답변
이것은에서 인용 부호를 다룰 때 사실상의 대답이므로 bash
쉘에서 산술 연산자를 다룰 때 위의 대답에서 놓친 점을 하나 더 추가합니다.
bash
쉘은 두 가지 연산을 지원하는 하나에 의해 정의 내장 let
명령 및 $((..))
연산자. 전자는 산술 표현식을 평가하는 반면 후자는 좀 더 복합적인 진술입니다.
함께 사용되는 산술 연산 식은 let
다른 쉘 명령과 마찬가지로 단어 분할, 경로 이름 확장 을 거치는 것으로 이해해야 합니다. 따라서 적절한 인용 및 탈출이 필요합니다.
사용할 때이 예제를 참조하십시오 let
let 'foo = 2 + 1'
echo $foo
3
여기에 작은 따옴표를 사용하면 변수 확장이 필요하지 않으므로 여기에서 절대 인용 부호를 사용하는 것이 좋습니다.
bar=1
let 'foo = $bar + 1'
$bar
아래 작은 따옴표는 확장 되지 않고 다음 과 같이 큰 따옴표로 묶어야 하므로 비참하게 실패 합니다.
let 'foo = '"$bar"' + 1'
이것은 이유 중 하나 $((..))
여야하며을 항상 과도하게 사용해야합니다 let
. 내용물이 단어를 쪼개지 않기 때문입니다. 사용하는 이전 예제 let
는 다음과 같이 간단하게 작성할 수 있습니다.
(( bar=1, foo = bar + 1 ))
항상 $((..))
작은 따옴표없이 사용하십시오
$((..))
큰 따옴표와 함께 사용할 수 있지만 그 결과 큰 따옴표가 필요한 내용을 포함 할 수 없으므로 목적이 없습니다 . 작은 따옴표가 아닌지 확인하십시오.
printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2
$((..))
작은 따옴표로 묶은 문자열 내 에서 연산자 를 사용하는 특별한 경우가있을 수 있습니다 . 연산자가 따옴표가 없거나 큰 따옴표로 묶는 방식으로 따옴표를 보간해야합니다. 예를 들어 curl
, 요청이 이루어질 때마다 카운터 내에서 연산자를 사용하여 카운터를 전달 하려는 경우를 고려하십시오.
curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'
리터럴 문자열 $((reqcnt++))
이 requestCounter
필드 로 전달 되지 않고 중첩 된 큰 따옴표를 사용하십시오 .