grep 명령을 사용하여 큰따옴표, 작은따옴표 또는 따옴표가 없는 문자를 찾는 것의 차이점이 무엇인지 알고 싶습니다.
grep ^'\' foo
grep ^"\" foo
grep \ foo
답변1
실제로 따옴표 바깥에 사용하고 \
넣으면 나쁜 예가 됩니다 ^
.
따옴표의 동작(또는 부재)은 일반적인 경험 법칙에 bash
따라 결정되는 것이 아니라 사용 중인 쉘에 의해 결정됩니다.grep
" double quotes Shell variables between the quotes are expanded
' single quote Shell variables do not get expanded
no quotes you can only use a single word, unless you escape the spaces.
따라서 쉘은 먼저 몇 가지 해석을 수행한 다음 인수를 grep
.
이제 몇 가지 예를 들어보겠습니다.
cat >afile <<EOF
a
aa
aaa
EOF
cat > abfile <<EOF
a
b
ab
aba
EOF
avar=a
afile
두 개의 파일 과 abfile
쉘 변수를 만듭니다 avar
.
grep 'a' afile
줄게:
a
aa
aaa
grep "a" afile
줄게:
a
aa
aaa
(같은). 따라서 grep "$avar" afile
변수를 확장하면 결과는 다음과 같습니다.avar
a
a
aa
aaa
그러나 grep '$avar' afile
변수는 확장되지 않으므로 avar
결과는 다음과 같습니다.
(비어 있는)
예제에서는 따옴표 없이 ab 파일이 생성됩니다. 이제 이유를 이해해야 합니다.
avar='a abfile'
grep $avar
다음을 제공합니다:
a
ab
aba
물론, 작은따옴표를 찾으려면 작은따옴표를 찾아야 하고 grep "'"
그 반대의 경우도 마찬가지입니다.
답변2
함께 연결된 따옴표 붙은 문자열로 구성된 모든 쉘 "단어"는 여전히 단일 인수입니다. 따라서 다른 규칙을 사용하여 논쟁할 수 있습니다.
Paul--) Q='One Two'
Paul--) J=A'${Q}'B"${Q}"C
Paul--) echo ::"${J}"::
::A${Q}BOne TwoC::
Paul--) echo ::${J}{Foo,Bar}::
::A${Q}BOne TwoCFoo:: ::A${Q}BOne TwoCBar::
Paul--) echo ::"${J}{Foo,Bar}"::
::A${Q}BOne TwoC{Foo,Bar}::