programing

Bash의 단일 따옴표와 이중 따옴표의 차이

muds 2023. 5. 1. 22:04
반응형

Bash의 단일 따옴표와 이중 따옴표의 차이

Bash에서 단일 따옴표 사이의 차이점은 무엇입니까?''및는 다음과 같습니다."")?

큰따옴표는 아무것도 삽입하지 않지만 큰따옴표는 삽입합니다. ": 변수, 역렬, 정특"\탈출 등

예:

$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")

Bash 설명서에는 다음과 같은 내용이 있습니다.

3.1.2.2 단일 따옴표

따옴표로 (따옴표로 묶습니다.'따옴표 안에 있는 각 문자의 리터럴 값을 유지합니다.백슬래시가 선행되는 경우에도 단일 따옴표 사이에 단일 따옴표가 발생하지 않을 수 있습니다.

3.1.2.3 이중 따옴표

를 묶습니다(따옴표로 문자를 ."따옴표 안에 있는 모든 문자의 리터럴 값을 보존합니다.$,`,\된 경우에는, " " 기확이활되면화성장"! 캐들터.$그리고.`큰따옴표 안에서 특별한 의미를 유지합니다( 확장 참조).백슬래시는 다음 문자 중 하나가 이어지는 경우에만 특별한 의미를 유지합니다.$,`,",\에서,에 오는 됩니다.큰따옴표 안에서 이러한 문자 중 하나 뒤에 오는 백슬래시가 제거됩니다.특별한 의미가 없는 문자 앞의 백슬래시는 수정되지 않은 채로 남아 있습니다.이중 따옴표는 백슬래시로 앞에 붙여서 큰따옴표 내에서 따옴표로 묶을 수 있습니다. ""이 수행되지 한 history expansion이 됩니다. 그렇지 않은 경우!백슬래시를 사용하여 큰따옴표로 표시되지 않습니다. 앞에 .!제거되지 않습니다.

변수는 다음과 같습니다.*그리고.@큰따옴표로 묶은 경우 특별한 의미가 있습니다(셸 매개 변수 확장 참조).

받아들여진 답변은 훌륭합니다.저는 주제를 빨리 이해하는 데 도움이 되는 표를 만들고 있습니다.설명은 단순 변수를 포함합니다.a 배열뿐만 arr.

우리가 설정하면,

a=apple      # a simple variable
arr=(apple)  # an indexed array with a single element

그리고 나서.echo두 번째 열에 있는 표현식은 세 번째 열에 표시된 결과/동작을 얻을 수 있습니다.네 번째 열은 동작을 설명합니다.

# 표현 결과 평.
1 "$a" apple 는 변가내서확다니 안에서 됩니다.""
2 '$a' $a 는 변가내부확않다았니 안에서 .''
3 "'$a'" 'apple' ''는 내에특의없다습니미가한별 안에 특별한 .""
4 '"$a"' "$a" ""문자 그대로 내부에서 처리됩니다.''
5 '\'' 무효한 을 면할 수 '에 내에''임쓰를 합니다."'"또는$'\'' 견적ANSI-C 참조)
6 "red$arocks" red $arocks하지 .$a임쓰를 합니다.${a}rocks보존하기 위해$a
7 "redapple$" redapple$ $에 변수 이 없으면 다에변 않습다니지평되가이로 됩니다.$
8 '\"' \" \는 내에특의없다습니미가한별 안에 특별한 .''
9 "\'" \' \'는 내에서해다니석됩부다 안에서 됩니다."" 하만의없습다니가미지ance에는 의미가 .'
10 "\"" " \"는 내에서해다니석됩부다 안에서 됩니다.""
11 "*" * 은 glob 내부에서 .""또는''
12 "\t\n" \t\n \t그리고.\n속에 특별한 의미가 없습니다.""또는''ANSI-C 견적 사용
13 "`echo hi`" hi ``그리고.$() 안에서 됩니다."" (백쿼터는실출서유지됨에력제백
14 '`echo hi`' `echo hi` ``그리고.$()에서 않음지평 안에서 .'' (백쿼터는실출서유지됨에력제백
15 '${arr[0]}' ${arr[0]} ▁access 안에서는 어레이 합니다.''
16 "${arr[0]}" apple 어레이 액세스가 내부에서 작동합니다.""
17 $'$a\'' $a' 단일 따옴표는 ANSI-C 견적 내에서 이스케이프할 수 있습니다.
18 "$'\t'" $'\t' 은 ANSI-C에서 해석되지 않습니다.""
19 '!cmd' !cmd 문자 록기확 문자장'!'는 에무됨시 내부에서 됩니다.''
20 "!cmd" cmd args 에서는 가장 에 일치하는 와 일치하는 명령어는 다음과 같습니다."cmd"
21 $'!cmd' !cmd 문자 록기확 문자장'!'ANSI-C 따옴표 내에서 무시됩니다.

참고 항목:

어떤 것을 반향시킬 때 어떤 일이 일어나는지를 언급한다면, 단일 따옴표는 문자 그대로 그들 사이에 있는 것을 반향시키는 반면, 이중 따옴표는 그들 사이의 변수를 평가하고 변수의 값을 출력합니다.

예를 들어, 이것은

#!/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

이것이 Bash에서 인용문을 다룰 때 사실상의 답이기 때문에 위의 답변에서 누락된 한 가지를 셸의 산술 연산자를 다룰 때 추가하겠습니다.

은 두 연산 하는데, 된 Bash 셸가 산지연방지다에 의해 됩니다. 하나는 기본 제공으로 정의됩니다.let 명령어를 합니다.$((..)). 전자는 표현에 .전자는 산술 표현식을 평가하고 후자는 복합 문장에 가깝습니다.

다음과 같이 사용되는 산술 표현식을 이해하는 것이 중요합니다.let다른 셸 명령과 마찬가지로 워드 프로세서, 경로 이름 확장을 수행합니다.따라서 적절한 견적과 탈출이 이루어져야 합니다.

이예참을 사용할 때 이 하십시오.let:

let 'foo = 2 + 1'
echo $foo
3

여기서는 변수 확장이 필요 없기 때문에 여기서는 단일 따옴표를 사용하는 것이 좋습니다.의 경우를 생각해 보십시오.

bar=1
let 'foo = $bar + 1'

그것은 비참하게 실패할 것입니다.$bar단일 따옴표 아래는 확장되지 않으며 다음과 같이 이중 따옴표로 묶어야 합니다.

let 'foo = '"$bar"' + 1'

이유 중입니다, 이은이것입다니하일나중유것▁this,,다니▁the이▁reasons것입▁be▁should것▁one▁the▁of,$((..))항상 과도하게 사용하는 것을 고려해야 합니다.let왜냐하면 그 안에는 내용물이 낱말로 나누어져 있지 않기 때문입니다.의 예는 이예제전한용을 사용한 입니다.let라고 간단히 말할 수 있습니다.

(( bar=1, foo = bar + 1 ))

항사용야함해를 사용하는 하세요.$((..))

록비록▁the비.$((..))큰따옴표와 함께 사용할 수 있으며, 큰따옴표가 필요한 콘텐츠를 포함할 수 없기 때문에 사용할 목적이 없습니다.인용문이 하나도 없는지 확인하십시오.

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밭.밭.

의 사용 사이에는 명확한 차이가 있습니다.' '그리고." ".

' '모든 것에 사용되며, "번역 또는 번역"은 수행되지 않습니다.그대로 인쇄되어 있습니다.

와 함께" "그것이 무엇을 둘러싸든, 그것의 가치로 "변환되거나" 변환됩니다.

번역/변환이란 다음을 의미합니다.단일 따옴표 내의 모든 항목은 해당 값으로 "변환"되지 않습니다.그들은 인용문 안에 있는 그대로 받아들여질 것입니다. 예:a=23,그리고나서echo '$a'을 생산할 것입니다.$a표준 출력으로반면에.echo "$a"을 생산할 것입니다.23표준 출력으로

사람들이 제가 해야 했던 것처럼 많은 시간을 보내지 않고 살아가기 위해서는 최소한의 대답이 필요합니다.

다음은 (답을 찾는 사람들에게) 놀랍게도 완전한 명령입니다.

$ echo '\'

다음의 출력을 사용할 수 있습니다.

\

백슬래시는, 놀랍게도, bash의 오랜 사용자들에게도, 단일 따옴표 안에 의미가 없습니다.다른 것들도 마찬가지입니다.

언급URL : https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash

반응형