if 문과 grep [중복]

if 문과 grep [중복]

내가 원하는 것은 사용자 입력을 받아 파일을 검색하는 것입니다. 일치하는 항목이 있으면 결과가 표시되고, 그렇지 않으면 $keyword not Found가 표시됩니다.

하지만 내 티켓은 항상 오류를 반환합니다.

       read -p "Enter keyword: " keyword
       if search="$(cat ./records | grep '$keyword')"
       then
       echo "$search"
       else
        echo "$keyword not found!"
       fi ;;

답변1

read -r -p 'Enter pattern: ' pattern

result=$( grep -e "$pattern" records )

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi
  • search(내 코드에서)에 대한 할당은 명령문 외부에서 수행하는 result것이 가장 좋습니다 .if

  • -n결과를 테스트하려면 ("이 문자열이 비어 있지 않습니까?")를 사용하십시오 .

  • 변수를 작은따옴표로 묶지 마십시오(이렇게 하면 쉘이 값을 확장하는 것을 방지할 수 있습니다). 큰따옴표로 변경합니다.

  • "키워드"가 아닌 "패턴"에 주목하세요. 여기서 수행하는 방식에서는 grep사용자 제공 문자열을 정규식(예: 패턴 cat.*dog)으로 사용하지만 반드시 일반 고정 문자열로 사용할 필요는 없습니다.

  • cat파일을 연결하는 데 사용해야 하며, 대부분의 경우에는 다소 쓸모가 없습니다.

  • read -r사용자가 백슬래시를 입력할 수 있도록 하는 데 사용됩니다 .


또는:

read -r -p 'Enter pattern: ' pattern

if ! grep -e "$pattern" records; then
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

이는 쉘 변수에 잠재적으로 많은 양의 데이터를 저장하는 것을 방지하고 대신 종료 상태를 사용하여 grep파일에서 패턴을 찾을 수 있는지 여부를 결정합니다. 패턴이 발견되면 일치하는 라인이 인쇄됩니다(다른 작업을 수행할 필요가 없음).

printf대신 사용에 관해서 echo:왜 printf가 echo보다 나은가요?


더 짧은 경우에는 단락 OR을 사용합니다.

read -r -p 'Enter pattern: '

grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"

답변2

아래를 참조하세요:

read -p "Enter keyword: " keyword

if search=$(grep "$keyword" ./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
  1. $()위에서 언급한 @jasonwryan처럼 따옴표를 사용하지 마세요.
  2. cat파이프를 사용할 필요가 없습니다 grep. grep <pattern> file대신 사용
  3. ;;나중에 삭제fi

관련 정보