Bash에서 grep은 \로 시작하는 줄을 찾고 백틱을 사용하여 결과를 할당합니다.

Bash에서 grep은 \로 시작하는 줄을 찾고 백틱을 사용하여 결과를 할당합니다.

Bash에서는 파일에서 \로 시작하는 줄을 찾고 백틱을 사용하여 결과를 반환하려고 합니다.

예를 들어:

echo \\Hello > myFile
out=`cat myFile | grep '^\\Hello'`
echo $out

아무것도 반환되지 않더라도

cat myFile | grep '^\\Hello'

예상대로 반환됩니다.

\Hello

이것은 매우 이상한 쉘 동작처럼 보입니다. 특히 tcsh의 유사한 명령 시퀀스는 예상한 대로 수행됩니다.

set out=`cat myFile | grep '^\\Hello'`; echo $out

반품

\Hello

무슨 일인지 설명해 줄 수 있는 사람이 있나요? 감사해요

답변1

읽다http://mywiki.wooledge.org/BashFAQ/082특히

백틱 내의 백슬래시는 명확하지 않은 방식으로 처리됩니다.

:

`...`

가장 오래된 비POSIX 호환 Bourne-Shell에만 필요한 레거시 구문입니다. 항상 Syntax 를 선호하는 데는 여러 가지 이유가 있습니다 $(...).

echo \\Hello > myFile

대신에

out=$(cat myFile | grep '^\\Hello')

조금 단순화하려면 다음을 수행하십시오.

out=$(grep '^\\Hello' myFile)

그 다음에

echo $out

공백/메타 문자를 포함하는 각 리터럴에 대한 "큰따옴표" 및모든확장자: "$var", "$(명령 "$var")", "${array[@]}", "a & b". 코드 또는 리터럴 $: "costs $5", ssh 호스트 "echo "$HOSTNAME""을 나타내려면 "작은따옴표"를 사용하십시오. 바라보다http://mywiki.wooledge.org/Quotes,http://mywiki.wooledge.org/Arguments그리고http://wiki.bash-hackers.org/syntax/words.

그래서 결국:

echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"

관련 정보