"큰따옴표 문자(")를 어떻게 입력하나요? 가 요청되고 있으며 동일한 답변으로 커뮤니티를 화나게 하고 싶지 않습니다. ( s
\"
에 포함되지 않은 경우 입력하고 s 에 포함된 경우'
입력하세요 .) 따라서 질문은 다음과 같습니다."
'
일반 문자처럼 터미널에 특수 문자를 입력할 수 없습니다. 예를 들어 이 명령은 실패합니다.
echo Updates (11)
그렇다면 터미널에서 일반 문자처럼 이러한 문자를 어떻게 입력합니까?
!#$^&*?[](){}<>~;'"\|<space><tab><newline>
답변1
많은 것은 케이싱에 달려 있습니다. 자세한 내용은 쉘 설명서를 확인하세요.
또한 일부 문자는 특정 상황에서만 특별하다는 점에 유의하세요. 예를 들어, 대부분의 셸에서는 목록 컨텍스트에서만 특별하고 POSIX 또는 csh와 같은 셸에서는 *
단어 시작이나 뒤에 특정 문자(예: )만 있습니다 . 에도 동일하게 적용됩니다 . 일부 셸에서는 와 일치할 때만 특별합니다(일부 제한 사항 있음) .?
~
:
=
zsh
[
]
일부 쉘(예: bash
또는 ) 에서는 yash
특수 문자(예: 공백 표시 구분 기호)도 로케일 설정에 따라 다릅니다.
인용 연산자(이러한 문자의 특별한 의미를 제거하기 위한)도 쉘마다 크게 다릅니다.
본 같은 껍질
sh
Bourne과 유사한 쉘(즉, 1980년대 이후 일부 시스템에서 호출되는 것으로 알려진 쉘) 요약:
본 쉘
특수 문자:
"'&|;()^`<>$
, 공백, 개행 및 탭은 따옴표가 없는 경우 간단한 명령줄에서 특별합니다.#
(이전 버전 제외) 줄 시작 부분에 공백, 탭 또는&|()^<>;`
.{
의 특별한 점 은}
셸 키워드(따라서 명령 위치에 있는 단어만)라는 것입니다.*?[
와일드카드로 특별하므로 목록 컨텍스트에서만 가능합니다. 와일드카드인 경우에는 인용하거나[
특별한 의미 를 제거하면 됩니다.[...]
[
]
=
이는 할당 연산자의 맥락에서 볼 때 특별합니다. 즉, 간단한 명령에서set -k
인수를 따르지 않는 모든 단어( 이후 제외)에 대해 적용됩니다.
참조 연산자
\
줄 바꿈을 제외한 모든 특수 문자를 인용하는 것은\<newline>
매우 긴 문자를 계속하는 방법입니다.논리적다음으로 이동물리적시퀀스를 삭제하려면 행). 백틱은\
처음에 닫는 백틱을 이스케이프 처리하고 파서를 돕는 데 사용되기 때문에 복잡성을 더한다는 점에 유의하세요 . 큰따옴표 내에서는\
자체를 이스케이프하는 데에만 사용할 수 있으며,"
($
여전히 줄 연속 문자)입니다`
.\<newline>
이 문서 내 에서 문자를 이스케이프하는 유일한 방법은"
.\
"..."
\
큰따옴표는 자신 ,$
및 를 제외한 모든 문자를 이스케이프합니다`
.'...'
작은따옴표는 자신을 제외한 모든 문자를 이스케이프합니다.
POSIX 쉘
POSIX 셸의 동작은 다음을 제외하면 기본적으로 Bourne 셸과 유사합니다.
^
더 이상 특수 문자가 없습니다.~
예어떤 경우에는 특별한{
특별 광고가 허용되므로 인용해야 합니다.
ksh
다음을 제외하고 POSIX와 유사합니다.
{string}
,
문자열에 따옴표가 포함되어 있지 않은 경우(또는..
일부 경우 및 일부 버전) 특별합니다.$'...'
ksh93에는 복잡한 규칙을 사용하는 추가 특수 참조 연산자가 있습니다 . 이 연산자는bash
FreeBSDzsh
, FreeBSD 및 busyboxmksh
에서도 찾을 수 있습니다(일부 변형 있음)sh
.ksh93
$"..."
문자열을 현지화해야 한다는 점을 제외하면 유사하게 작동하는 참조 연산자 도 있습니다"..."
(사용자 언어로 변환하도록 구성할 수 있음). 에서는mksh
무시하세요 .$
$"..."
ksh93r
csh 스타일 기록 확장은 대화형 셸에서 지원 되므로ksh93
(기본적으로 활성화되지 않음) 명령 시작이 특별해집니다. 일부 상황에서는 특별하며(공백이나 TAB이 뒤에 올 때나 이 문서에서는 그렇지 않음) 큰따옴표로 이스케이프되지 않습니다. 백슬래시(특별한 의미를 제거하는 큰따옴표가 아닌)와 작은따옴표만 이스케이프됩니다.-H
-o histexpand
^
!
!
\
!
bash
다음과 같지만 ksh93
:
- 단일 바이트 문자 로케일에서는 모든공백(로케일에 따라) 문자는 구분 기호(예: 공백 또는 탭)로 처리됩니다. 실제로 이는 일부 로케일에서 공백 문자일 수 있는 경우 비트 8이 설정된 모든 바이트를 인용해야 함을 의미합니다.
- csh 기록 확장은 위의 ksh93과 동일한 주석을 사용하여 대화형 인스턴스에서 기본적으로 최신 버전에서만 활성화되며
bash
,!
뒤에"
. - csh와 마찬가지로
%
작업을 수행하기 위해 명령 시작 부분에 사용됩니다. 명령을%1
실행하는 대신 첫 번째 작업을 포그라운드로 가져옵니다 . 배경에 넣어도%1
마찬가지 ..%1 &
zsh
다음과 같지만 ksh93
:
- 백슬래시를 제외하고는 csh 기록 확장과 동일한 주석을 사용하여 csh에서와 마찬가지로 큰따옴표 내에서 이스케이프
bash
할 수 있습니다 .!
=
단어의 첫 번째 문자(=ls
로 확장됨/bin/ls
)가 특별하기 때문입니다.%
명령 위치의 bash와 동일한 설명입니다.{
그리고}
분리되지 않은 경우 명령 그룹을 열고 닫는 것도 가능합니다({echo text}
Bourne의 작업에서처럼{ echo text;}
).[
특별한 경우를 제외하고는[
로 끝나지 않더라도 인용은 필수입니다]
.- 이
extendedglob
옵션이 활성화되면 ,#
및^
은~
와일드카드 연산자입니다. - 이
braceccl
옵션을 사용하면{non-empty-string}
특별합니다. $"..."
지원하지 않습니다.- 특이한 점은
?
단어 시작 부분(또는 인용 또는 확장) 뒤에 a가 오는 경우(작업 사양을 허용하기 위해) 특별하지 않다는 것입니다.%
%?name
- 옵션
rcquotes
(기본적으로 활성화되지 않음)을 사용하면''
작은따옴표 안에 작은따옴표를 입력 할 수 있습니다rc
(아래 참조).
yash
그거 빼고요 POSIX
.
- 모든 공백 문자는 구분 기호로 간주됩니다.
brace-expand
zsh 스타일 중괄호 확장을 구현하려면 이 옵션을 사용하십시오 .- 명령 위치의 bash 및 zsh와 동일한 설명입니다
%
(POSIX 모드 제외).
모든 쉘과 마찬가지로 인용이 다르게 작동하는 특별한 상황이 있습니다. 여기서는 이미 문서와 백틱을 언급했지만 [[...]]
ksh 및 기타 셸, POSIX 구문 에도 이러한 항목 $((...))
이 있습니다.case
또한 확장(큰따옴표 사용) 또는 여기에 적용된 문서 구분 기호와 관련하여 인용은 다른 부작용이 있을 수 있습니다. 또한 예약어를 비활성화하고 별칭 확장에 영향을 줍니다.
일반화하다
Bourne과 같은 쉘에서, !#$^&*?[(){}<>~;'"`|=
SPC, TAB, NEWLINE 및 비트 8이 설정된 일부 바이트는 (적어도 일부 컨텍스트에서는) 특별하거나 특별할 수 있습니다.
특별한 의미를 제거하여 문자 그대로 처리하려면 따옴표를 사용할 수 있습니다.
사용:
'...'
각 문자의 특별한 의미를 제거합니다.printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as single arguments (without the enclosing quotes) to `printf`'
\
문자의 특별한 의미만 제거합니다.printf '<%s>\n' foo bar\ baz #comment
위에서는 a 앞의 공백 문자만
\
문자 그대로 전달됩니다printf
. 다른 것들은 셸에서 토큰 구분 기호로 처리됩니다.매개변수 확장( , , ...), 산술 확장( 일부 쉘 에서도 )을
"..."
허용하면서 문자를 인용하는 데 사용됩니다 .$var
$#
${foo#bar}
$((1+1))
$[1+1]
명령 대체($(...)
또는 이전 형식입니다`...`
. 실제로 대부분의 경우어쨌든 나는 이 확장을 큰따옴표 안에 넣고 싶습니다..\
inside를 사용하면"..."
여전히 특별하지만 해당 문자만 해당 문자의 특별한 의미를 제거할 수 있습니다.문자열에 문자가 포함된 경우 나머지 문자를
'
계속 사용할 수 있으며 or 또는 (사용 가능한 경우) 처럼 인용할 수 있는 다른 인용 메커니즘을 사용할 수 있습니다 .'...'
'
"'"
\'
$'\''
echo 'This is "tricky", isn'\''t it?'
현대적인
$(...)
형태의 명령 대체를 사용하십시오. 이전 버전은`...`
Bourne 쉘과의 호환성을 위해서만 사용됩니다. 즉, 매우 오래된 시스템의 경우, 사용되지 않는 경우 변수 할당에만 사용됩니다.echo "`echo "foo bar"`"
Bourne 쉘이나 ksh의 AT&T 버전에서는 작동하지 않습니다. 또는:
echo "`echo \"foo bar\"`"
이는 Bourne 및 AT&T ksh에서는 작동하지만
yash
(2020년 편집자:2.41 이하 버전에서만,2.42에서 변경되었습니다./오류 보고서/범죄), 그러나 다음을 사용하십시오.var=`echo "foo bar"`; echo "$var"
이것은 모든 사람에게 적용됩니다.
또한 큰따옴표를 사용하여 이식 가능하게 중첩할 수 없으므로 변수가 다시 사용됩니다. 또한 특수 백슬래시 처리에 유의하세요.
var=`printf '%s\n' '\\'`
$var
백슬래시 내부에 추가 백슬래시 처리 계층이 있으므로(\
, ` 및$
("
인용된 경우 제외 )) 백슬래시를 내부적으로만 저장하므로yash
다음이 필요합니다.var=`printf '%s\n' '\\\\'`
또는
var=`printf '%s\n' '\\\'
대신에.
Ces 가족
csh와 tcsh는 구문이 크게 다르지만 공유 유산으로 인해 Bourne 쉘과 여전히 많은 공통점을 가지고 있습니다.
특수 문자:
"'&|;()^`<>$
, 공백, 줄 바꿈 및 탭은 따옴표가 없는 모든 곳에서 특별합니다.#
(csh는 주석 리더로 소개된 쉘입니다#
)는 스크립트 시작 부분이나 인용되지 않은 공백, 탭 또는 개행 문자 뒤에 특별합니다.*?[
와일드카드로 특별하므로 목록 컨텍스트에서{anything}
독립적인 특별한 경우를 제외하고는 특별합니다{}
(csh는 중괄호 확장을 도입하는 쉘입니다).!
^
역사적 확장(csh의 발명이기도 함)의 일부로 특별하며 인용 규칙도 특별합니다 .~
(물결표 확장도 csh 발명품입니다.) 어떤 경우에는 특별합니다.- bash, zsh 및 yash와 마찬가지로
%
명령 위치는 작업 운영에 사용됩니다(csh의 또 다른 발명품).
참조 연산자
Bourne 쉘과 동일하지만 동작이 다릅니다. 구문 관점에서 볼 때 tcsh는 csh처럼 작동하며 많은 csh 버전에 심각한 버그가 있음을 알 수 있습니다. 대략적으로 작동하는 csh 버전을 얻으려면 최신 버전의 tcsh를 구하십시오.
\
줄 바꿈을 제외한 단일 문자를 이스케이프합니다(Bourne 쉘과 동일). 이스케이프할 수 있는 유일한 참조 연산자입니다!
.\<newline>
이스케이프하지는 않지만 명령 구분 기호에서 토큰 구분 기호(예: 공백)로 변환합니다."..."
$
자신, ,`
개행 문자 및 를 제외한 모든 문자를 이스케이프합니다!
. Bourne 쉘과 달리\
escape$
및`
inside 는 사용할 수 없지만 escape 또는 newline은"..."
사용할 수 있습니다 (단, a 또는 newline이 앞에 오지 않는 한 자체는 사용할 수 없음). 말 은 , 말 은 .\
!
!
!
"\!"
\!
"\\!"
'...'
!
자신과 개행 문자를 제외한 모든 문자를 이스케이프합니다 . 큰따옴표와 마찬가지로!
개행 문자도 백슬래시로 이스케이프할 수 있습니다.- 명령 대체는 구문을 통해서만 가능하며
`...`
안정적으로 사용하기 어렵습니다. - 변수 대체 역시 설계가 매우 잘못되어 오류가 발생하기 쉽습니다. 연산자는
$var:q
변수와 관련된 보다 안정적인 코드를 작성하는 데 도움이 됩니다.
일반화하다
가능하다면 csh를 멀리하세요. 사용할 수 없는 경우:
- 작은따옴표는 대부분의 문자를 인용합니다.
!
개행 문자가 여전히 필요합니다\
. \
대부분의 문자를 벗어날 수 있습니다"..."
$var:q
일부 확장을 허용하는 것이 가능하지만 개행 및/또는 백슬래시 문자가 포함된 경우에는 문제가 발생하므로 작은 따옴표를 사용하고 변수 확장을 수행하는 것이 더 좋습니다 . 배열의 요소를 안정적으로 연결하려면 루프를 사용해야 합니다.
rc
가족
rc
plan9
껍질 이에요 . plan9 코드는 이제 FLOSS로 출시되었으며 해당 사용자 공간 소프트웨어는 rc
Linux로 포팅되었습니다. Byron Rakitzis는 또한 1990년대 초에 Unix용 복제본을 작성했으며 rc
, 여기에서 es
과 akanga
.
이전 버전과의 호환성을 위해 Bourne과 같은 쉘을 사용하지 않았다면 모든 사람이 사용할 더 깨끗하고 더 나은 구문을 갖춘 쉘입니다.
rc
/akanga
특수 문자
#;&|^$=`'{}()<>
, SPC, TAB 및 NEWLINE은 인용되지 않은 경우 항상 특별합니다.*?[
와일드카드 연산자입니다.
참조 연산자
'...'
유일한 참조 연산자입니다. 텍스트는 다음과 같이 '
작은따옴표로 묶입니다 ''
.
echo 'it''s so simple isn''t it?'
es
es
로 볼 수 있다실험적인쉘은 rc
.
그러나 약간의 차이점이 있습니다. 이 Q&A에서 흥미로운 점은 이것이 \
인용 연산자(줄 바꿈을 제외한 모든 특수 문자를 인용)이기도 하며 \n
줄 바꿈, \b
백슬래시와 같은 이스케이프 시퀀스를 도입하는 데에도 사용할 수 있다는 것입니다.
물고기
Fish는 주로 대화형 사용을 위해 고안된 상대적으로 새로운 제품(2005년경)이며 다른 쉘과 상당히 다른 구문을 가지고 있습니다.
특수 문자
"'\()$%{}^<>;&|
인용되지 않은 경우 항상 특별합니다%
(PID 확장의 경우)는 다른 쉘과 크게 다르며`
특별하지 않습니다.#
(주석) 인용되지 않은 공백, 탭, 줄 바꿈 또는;&|^<>
*?
(그러나 아님[...]
) 와일드카드 연산자
참조 연산자
\
개행 문자 이외의 단일 특수 문자를 인용하지만 C 이스케이프 시퀀스(\n
,\b
...) 리더로도 사용됩니다. IOW,\n
인용문이 아니라n
개행 문자입니다."..."
자신을 제외한 모든 것을 인용$
하고 백슬래시와 백슬래시를 사용하여 이스케이프할 수 있습니다.\<newline>
내부 연속 라인(삭제됨)입니다"..."
.'...'
자신과 를 제외한 모든 항목을 인용하며\
백슬래시를 사용하여 이스케이프할 수 있습니다.
답변2
1. 탈출
다음과 같이 모든 문자를 이스케이프하려면 a를 사용하십시오 \
(개행/캐리지 리턴 문자에는 작동하지 않음).
$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.
2.큰따옴표
다음과 같이 전체 텍스트를 "
s로 묶습니다.
$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!
3. 작은따옴표
큰따옴표와 동일하지만 특별한 표시가 없습니다.
$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof