큰따옴표가 있는 grep, 작은따옴표 또는 큰따옴표가 없는 grep의 차이점

큰따옴표가 있는 grep, 작은따옴표 또는 큰따옴표가 없는 grep의 차이점

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변수를 확장하면 결과는 다음과 같습니다.avara

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}::

관련 정보