내가 원하는 것은 사용자 입력을 받아 파일을 검색하는 것입니다. 일치하는 항목이 있으면 결과가 표시되고, 그렇지 않으면 $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
$()
위에서 언급한 @jasonwryan처럼 따옴표를 사용하지 마세요.cat
파이프를 사용할 필요가 없습니다grep
.grep <pattern> file
대신 사용;;
나중에 삭제fi