grep의 출력을 실패하게 만드는 방법은 무엇입니까?

grep의 출력을 실패하게 만드는 방법은 무엇입니까?

키워드를 검색하고 결과를 터미널에 표시하기 위해 if-else 문을 사용하고 있습니다. 여기에 내 코드 샘플이 있습니다.

read finding

if ["$finding" != "" ]; then
   grep $finding information.txt
else
   echo "No such information in database."
fi

그런데 존재하지 않는 정보를 입력하면 단말기에 아무 것도 표시되지 않습니다. 나는 약 일주일 전에 쉘을 사용하기 시작했고 일부 코드가 어떻게 작동하는지에 대해 좀 더 설명이 필요할 수도 있습니다.

답변1

  • 그 뒤에 공백을 추가하세요 [(명령어입니다)
  • -n문자열의 길이가 0이 아닌지 테스트하거나 -z0인지 테스트하는 데 사용됩니다 .
  • 변수 주위에 큰따옴표 추가

그래서:

read finding

if [ -z "$finding" ]; then
    echo "You didn't enter anything"
else
    grep "$finding" information.txt
    if [ ! "$?" -eq 0 ]; then
        echo "No such information in database."
    fi
fi

답변2

일부를 사용논리 연산자(@jimmij를 통해)

grep -q "$finding" information.txt부울 응답처럼 동작합니다(아무것도 인쇄하지 않고, 발견되면 상태 0을 반환하고 그렇지 않으면 0이 아닌 상태를 반환합니다).

grep -F -- "$finding" ...정규식 대신 텍스트 검색(정규식을 검색하려면 제거하세요. 보안 위험이 있을 수 있습니다... (@StephanChazelas에게 감사드립니다))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

심지어

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(그러나 두 번째 실행 grep및/또는 echo첫 번째 실행이 echo실패하는 경우에도 실행된다는 점에 유의하세요)

편집 1 > explain grep -q ... 틀림없이.

일반적으로 grep은 0 상태를 반환합니다(오류가 발생하면(예: 파일을 찾을 수 없음) 단순히 "non-0"을 반환합니다)

grep -qF exp file파일에서 exp가 발견되면 0을 "반환"하고, 그렇지 않으면 오류가 발생합니다( grep -q exp fileregexp가 일치하면 수행됨).expfile

이 동작은 bash 제어문(if, elif, while, &&, || 등)과 함께 사용할 수 있습니다.

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi

답변3

i=0
until  [ "$((i+=1))" -gt 5 ] || {
       printf '\nPrompt: '
       read finding && [ -n "$finding" ]
};do   printf '\nINVALID:\tTry again.\n'
done   <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2

비어 있지 않은지 테스트해야 할 뿐만 아니라 성공적으로 완료되었는지 $finding도 테스트해야 하므로 read먼저 설정하세요. 위의 루프는 프롬프트를 표시하고 터미널에서 비어 있지 않은 입력 줄을 읽으려고 시도한 다음 오류와 함께 종료됩니다.

  • "${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
    • 널값은 $finding매개변수 확장의 부작용으로 처리되어 메시지가 기록되고 비대화형 쉘이 즉시 종료됩니다.${:?}stderr
  • cmd ... <redirected_input_file
    • 열 수 없는 파일에서 리디렉션을 시도하는 것은 구문 오류입니다.(예를 들어 존재하지 않거나 유효한 UID/GID에 읽기 권한이 없습니다.)따라서 info.txt어떤 이유로든 작동하지 않으면 비대화형 쉘은 진단 메시지를 작성 stderr하고 즉시 종료됩니다. 시도가 read제한을 초과하는 경우에도 마찬가지입니다. 영향을 미치며 ulimit초기 루프에도 동일하게 적용됩니다 until ... done <>in >&out.
  • grep ... || ! printf '%s: fmt' "$param"
    • 사용자 또는 파일 입력 오류로 인해 이미 호출이 이루어지기 전에 쉘이 종료되기 때문에 grep위 형식에서 가능한 두 가지 결과는 grep최소한 한 번 패턴을 일치시키고 해당 행을 작성하거나 한 번도 일치하지 않고 0이 아닌 값을 반환합니다. 후자의 경우 정보 메시지가 기록되고 1이 반환됩니다."$finding"stdoutprintfstderr

관련 정보