그것은 껍질에 달려 있습니다. 자세한 내용은 쉘 설명서를 확인하십시오.
또한 일부 문자는 일부 상황에서만 특별합니다. 예를 들어, 대부분의 쉘에서, *
그리고 ?
POSIX 나에 CSH 같은 쉘, 목록 컨텍스트에서만 특별 ~
같은 일부 문자를 다음 단어의 시작 또는에서만 특별하다 :
. 대한 동일 =
에서 zsh
. 일부 쉘에서는 [
a와 일치 할 때 (일부 제한 사항이있는 경우)에만 특별합니다 ]
.
bash
또는 과 같은 일부 쉘에서는 yash
공백 토큰 구분 기호와 같은 특수 문자도 로케일에 따라 다릅니다.
인용 문자 (해당 문자의 특수 의미를 제거하기 위해)도 쉘마다 크게 다릅니다.
본 같은 껍질
Bourne과 같은 쉘 ( sh
80 년대 이후 일부 시스템 또는 다른 시스템에서 호출 된 것으로 알려진 쉘)에 대한 요약 :
본 쉘
특수 문자:
"\'&|;()^`<>$
, space, newline 및 tab은 인용되지 않은 간단한 명령 행에서 특별합니다.
#
(초기 버전 제외)는 줄의 시작 부분이나 인용 부호가없는 공백, 탭 또는 뒤에 나오는 특수 문자 &|()^<>;`
입니다.
{
그리고 }
그들은 쉘 키워드 (명령 위치에서 너무 만 단어)입니다 만 특별한에 있습니다.
*?[
globbing 연산자처럼 특별하므로 목록 컨텍스트에서만 가능합니다. 의 경우 [
, 그건 [...]
그이 글 로빙 연산자, 하나 [
또는 ]
단지 특별한 의미를 제거하기 위해 인용 될 필요가있다.
=
할당 연산자로 취급되는 상황에서는 특별합니다. 즉, 간단한 명령으로 인수를 따르지 않는 모든 단어에 대해 (after 제외 set -k
)입니다.
인용 연산자
\
개행을 제외한 모든 특수 문자를 인용합니다 ( 다음 실제 행 에 \<newline>
긴 논리 행 을 계속하여 순서가 제거됨). 백틱 (backticks) 은 그 안에있는 것처럼 추가적인 복잡성을 추가하며, 닫는 백틱 (backtick)을 피하고 파서를 돕는 데 먼저 사용됩니다. 큰 따옴표 내부, 단지 자신을 탈출하기 위해 사용될 수있다, , 과 ( 여전히 줄 연속이다). here를 제외하고는 여기 문서 내부에 있습니다 . 이 문서 내에서 문자를 이스케이프 처리하는 유일한 방법입니다.\
\
"
$
`
\<newline>
"
\
"..."
큰 따옴표는 모든 문자를 제외하고 자체 \
, $
및 `
.
'...'
작은 따옴표는 모든 문자를 제외한 모든 문자를 이스케이프합니다.
POSIX 쉘
POSIX 쉘은 다음을 제외하고 대부분 Bourne 쉘과 유사하게 작동합니다.
^
더 이상 특별한 성격이 아닙니다
~
어떤 상황 에서는 특별하다
{
특별 할 수 있으므로 인용해야합니다.
ksh
POSIX와 같은 것을 제외하고 :
{string}
문자열에 따옴표가없는 경우 ,
(또는 ..
경우에 따라 버전 이있는 경우) 특별합니다 .
- ksh93에는
$'...'
복잡한 규칙을 가진 특별한 인용 연산자가 있습니다. 즉, 오퍼레이터로도 (일부 변형하여) 발견 bash
, zsh
, mksh
와 FreeBSD 및 비지 sh
.
ksh93
또한 문자열에 현지화가 적용되는 것을 제외하고 $"..."
작동 하는 인용 연산자 "..."
가 있습니다 (사용자 언어로 번역되도록 구성 할 수 있음). in을 mksh
무시합니다 .$
$"..."
bash
같은 ksh93
하지만 :
- 1 바이트 문자 로케일에서 모든 공백 (로케일에 따라) 문자는 공백 또는 탭과 같은 분리 문자로 간주됩니다. 실제로, 일부 로케일에서 공백 문자 일 수있는 경우를 대비하여 8 번째 비트 세트로 모든 바이트를 인용해야합니다.
- 대화식 인스턴스에서와 같이 csh 히스토리 확장이 사용 가능한 경우
!
일부 컨텍스트에서 특별하며 큰 따옴표가 항상 이스케이프하지는 않습니다. 그리고 ^
명령 시작 부분에서 특별합니다.
zsh
같은 ksh93
하지만 :
bash
csh 히스토리 확장 과 동일한 참고 사항
=
단어의 첫 문자로 =ls
확장됩니다 (로 확장 /bin/ls
).
{
과 }
(와 같이 구분하지 않는 경우도 열고 닫을 명령 그룹 수 {echo text}
Bourne 씨의 같은 작품 { echo text;}
).
[
단독으로 제외하고으로 [
닫지 않아도 인용이 필요합니다 ]
.
- 으로
extendedglob
옵션이 활성화 #
, ^
및 ~
연산자를 globbing을한다.
braceccl
옵션을 사용하면 {non-empty-string}
특별합니다.
$"..."
지원되지 않습니다.
- 특수한 특기 사항 으로, 단어의 시작 부분에서 ( 작업 스펙 을 허용하기 위해) (따옴표가 있거나 확장 된 경우)를 따를
?
때 특별하지 않습니다.%
%?name
rcquotes
(기본적으로 활성화되지 않음) 옵션은 하나가 아니라 작은 따옴표 입력 할 수 있습니다 ''
라 à 내부에 작은 따옴표 rc
(아래 참조).
yash
같은 POSIX
것을 제외시켰다.
- 모든 공백 문자는 구분 기호로 간주됩니다.
- 이
brace-expand
옵션을 사용하면 zsh 스타일 괄호 확장을 구현합니다.
모든 셸에는 따옴표가 다르게 작동하는 특수한 컨텍스트가 있습니다. 우리는 이미 여기에 문서와 백틱을 언급했지만 [[...]]
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]
일부 포탄에) 및 명령 치환 ( $(...)
또는 이전 형태 `...`
. 사실, 대부분의 시간, 당신은 할 내부 이러한 확장을 데려 가고 싶다는 어쨌든 큰 따옴표를 사용 하여 여전히 특수한 문자 (단지 문자)의 특수 의미를 제거하기 위해 \
within "..."
을 사용할 수 있습니다 .
문자열에 '
문자 가 포함되어 있으면 '...'
나머지에 계속 사용할 수 '
있고 "'"
또는 인용 \'
가능 하거나 인용 가능한 다른 인용 메커니즘을 사용할 수 있습니다 $'\''
.
echo 'This is "tricky", isn'\''t it?'
현대적인 $(...)
형태의 명령 대체를 사용하십시오 . `...`
Bourne 쉘과의 호환성, 예를 들어 매우 오래된 시스템과의 호환성을 위해 이전 버전 만 사용하고 다음 과 같이 사용하지 않는 변수 할당에서만 사용하십시오.
echo "`echo "foo bar"`"
Bourne 쉘 또는 AT & T 버전의 ksh에서는 작동하지 않습니다. 또는:
echo "`echo \"foo bar\"`"
Bourne 및 AT & T ksh와 함께 작동하지만와 함께 작동하지 yash
않지만 다음을 사용합니다.
var=`echo "foo bar"`; echo "$var"
그것은 모두와 함께 작동합니다.
큰 따옴표로 이식 가능하게 중첩하는 것도 불가능하므로 변수를 사용하십시오. 또한 특수 백 슬래시 처리에주의하십시오.
var=`printf '%s\n' '\\'`
백틱 내에 $var
백 슬래시 처리 (for \
,`및 $
(및을 "
제외하고 인용 된 경우 yash
)) 수준이 있으므로 내부에 하나의 백 슬래시 만 저장 합니다.
var=`printf '%s\n' '\\\\'`
또는
var=`printf '%s\n' '\\\'
대신에.
Csh 가족
csh와 tcsh는 구문이 상당히 다르지만 Bourne 쉘과 공통된 유산이 있기 때문에 여전히 공통점이 많습니다.
특수 문자:
"\'&|;()^`<>$
, 공백, 줄 바꿈 및 탭은 인용되지 않은 모든 곳에서 특별합니다.
#
(csh는 #
주석 리더로 소개 된 셸입니다 ) 스크립트 시작시 또는 인용되지 않은 공백, 탭 또는 줄 바꿈을 따르는 것이 특별합니다.
*?[
목록 컨텍스트에서 globbing 연산자만큼 특별합니다.
{non-empty-string}
특별하다 (csh는 괄호 확장을 도입 한 쉘이다).
!
및 ^
이력 확장 (다시, CSH 발명)의 일부로서 특정하고, 인용 규칙은 특별하다.
~
(물결 확장 또한 csh 발명) 일부 상황에서는 특별합니다.
인용 연산자
Bourne 쉘과 동일하지만 동작이 다릅니다. tcsh는 구문 관점에서 csh처럼 동작합니다. 많은 csh 버전에 버그가있는 것을 알 수 있습니다. ctc의 대략적인 버전을 얻으려면 최신 버전의 tcsh를 얻으십시오.
\
개행을 제외한 단일 문자를 이스케이프합니다 (Bourne 쉘과 동일). 이스케이프 할 수있는 유일한 인용 연산자입니다 !
. \<newline>
이스케이프하지 않고 명령 구분 기호에서 공백으로 토큰 구분 기호로 변환합니다.
"..."
자체 제외한 모든 문자를 탈출 $
, `
, 줄 바꿈 및 !
. Bourne 쉘과 달리 \
이스케이프 $
및 `
내부 "..."
를 사용할 수는 없지만 \
이스케이프 !
또는 개행을 사용할 수는 있습니다 (단 !
, 개행 이전의 경우를 제외하고 는 사용할 수 없음 ). 리터럴 !
은 "\!"
이고 리터럴 \!
은 "\\!"
입니다.
'...'
자체를 제외한 모든 문자 !
와 줄 바꿈을 이스케이프합니다 . 큰 따옴표와 마찬가지로 !
백 슬래시로 줄 바꿈을 이스케이프 처리 할 수 있습니다.
- 명령 대체는
`...`
구문을 통해서만 이루어 지며 안정적으로 사용될 수 없습니다.
- 변수 대체는 상당히 잘못 설계되어 오류가 발생하기 쉽습니다.
$var:q
운영자는보다 안정적인 코드를 포함하는 변수를 작성하는 데 도움이됩니다.
요약
가능하면 csh에서 멀리 떨어지십시오. 사용할 수없는 경우 :
- 작은 따옴표는 대부분의 문자를 인용합니다.
!
그리고 줄 바꿈에는 여전히 \
.
\
대부분의 캐릭터를 탈출 할 수 있습니다
"..."
그 안에 일부 확장을 허용 할 수 있지만 개행 문자 및 / 또는 백 슬래시 문자를 포함하면 작은 버그가 있습니다. 작은 따옴표 만 사용하고 $var:q
변수 확장에 가장 좋습니다 . 배열의 요소를 안정적으로 결합하려면 루프를 사용해야합니다.
rc
가족
rc
는 IS plan9
쉘와 그 하위 같은 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>
내부의 줄 연속 (제거) "..."
입니다.
'...'
자체와를 제외한 모든 것을 인용 \
하면 백 슬래시를 사용하여 이스케이프 처리 할 수 있습니다.
=
,@
그리고%
어떤 상황에서 어떤 껍질에 특별하다.