명령을 []/[[]]로 묶지 마십시오)

명령을 []/[[]]로 묶지 마십시오)

방금 쉘을 배웠고 vscode와 쉘 체크를 사용하여 systax를 확인합니다. 내가 하고 있는 일의 예는 다음과 같습니다. 특정 텍스트 파일에 문자열이 있는지 확인하고 싶습니다.

#!/usr/bin/bash
Echo "Enter user"
if [ $grep -q binhqq "text.txt"] ; then
  echo "Found"
fi

그런데 왜 이런 경고가 표시되는지 경고해 주셨네요. Don't wrap commands in []/[[]])정말 감사합니다.

답변1

스크립트에는 몇 가지 기본적인 문제가 있습니다.

  • Echo당신은 대신 사용echo

  • $grep대신 사용합니다 grep. $변수를 역참조하기 위해 여기서는 필요하지 않습니다.

  • 사용자에게 말하지만 Enter user실제로 입력 내용을 읽지는 않습니다.

쉘 점검 경고:

SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.

grep -q binhqq "text.txt"내부가 유효한 EXPR이 아니고 test( 참조 help test) 다음을 사용하여 수정할 수 있기 때문에 발생합니다.명령 대체:

if [ -n "$(grep binhqq text.txt)" ] ; then

(출력이 grep비어 있지 않은지 테스트) 또는 [및 완전히 제거하십시오 ].

if grep -q binhqq "text.txt" ; then

(종료 상태에 따라 다름 grep)

답변2

구문에 주의하세요 if(bash에는 매우 유용한 대화형 help시스템이 있습니다)

$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
    Execute commands based on conditional.

    The `if COMMANDS' list is executed.  If its exit status is zero, then the ...

키워드를 본 후 bash는 명령을 볼 것으로 예상합니다. 특별한 것은 없습니다 if. 단지 내장된 명령이나 키워드일 뿐입니다. 여기에는 어떤 명령 목록/파이프라인도 넣을 수 있습니다.[[[((

마법은 if가지가 다음을 기반으로 한다는 것입니다.종료 상태명령 수: 종료 상태가 다음과 같은 경우그런 다음 "실제" 분기를 선택합니다.0이 아닌종료 상태로 인해 "false" 분기가 발생합니다.

답변3

[명령 test(또는 동일한 기능을 가진 내장 명령)의 별칭입니다.

따라서 이 작업을 수행할 때 명령을 호출 [ grep …하고 전달합니다 . 그런 다음 "당신이 말한 내용을 이해할 수 없습니다 ." 라고 말하십시오.test grep ….testgrep …testgrep …

관련 정보