아래 코드를 실행하면 내 컴퓨터에서는 감지되지만 내 사무실 컴퓨터에서 동일한 명령을 실행할 때는 감지되지 않습니다. 이 모호한 동작의 이유는 무엇일까요?
$p는 텍스트 파일의 한 줄이며 xyzxyz if ( abc )
읽는 동안 grep에 줄을 전달하는 데 사용합니다.
grep -qw -e 'if(' -e 'if' <<< $p
if [ $? -ne 0 ]; then
do something
fi
답변1
이전 버전에는 bash
해당 버그/잘못된 기능이 있었습니다.
cat <<< $var
의 내용은 $var
단어로 분할되지만(와일드카드로 구분되지 않음), 결과 단어는 공백으로 연결된 다음 명령에 대한 입력으로 설정된 임시 파일에 저장됩니다 cat
.
<<<
이는 이 zsh 연산자를 지원하는 다른 쉘과 일관성을 유지하기 위해 bash-4.4에서 수정되었습니다.
이전 버전의 경우 이는 변수를 참조해야 하는 또 다른 경우입니다.
따라서 다음 을 $IFS
포함 하면 차이점을 설명할 수 있습니다 .i
f
$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if
어쨌든, -e 'if('
텍스트에 if(
단어가 포함되어 있으면 if
단어도 포함되므로 중복된다는 점에 유의하세요.
또한 bash
정규식 일치 기능이 내장되어 있으므로 언제든지 다음을 수행할 수 있습니다.
re='\<if\>'
if [[ $p =~ $re ]]; then
printf '"%s" contains a "if" word\n' "$p"
fi
(적어도 Linux Mint 및 RHEL과 같은 시스템에서는 ERE에 가 있지만 \<
지원 한다면 \>
ERE 에는 및 가 있을 가능성이 높습니다 .grep
-w
\<
\>
(위의 경우는 인용이 필요하지 않은 매우 드문 경우 중 하나입니다 $p
(인용해도 문제가 되지는 않지만).$re
기필코 아니다인용됨(그렇지 않으면 내용이 정규 표현식이 아닌 고정 문자열로 처리됨)
표준 sh
구문을 사용하여 다음을 수행할 수도 있습니다.
case +$p+ in
(*[^[:alnum:]_]if[^[:alnum:]_]*)
printf '"%s" contains a "if" word\n' "$p"
esac
같은 효과를 얻으려면.