키워드를 검색하고 결과를 터미널에 표시하기 위해 if-else 문을 사용하고 있습니다. 여기에 내 코드 샘플이 있습니다.
read finding
if ["$finding" != "" ]; then
grep $finding information.txt
else
echo "No such information in database."
fi
그런데 존재하지 않는 정보를 입력하면 단말기에 아무 것도 표시되지 않습니다. 나는 약 일주일 전에 쉘을 사용하기 시작했고 일부 코드가 어떻게 작동하는지에 대해 좀 더 설명이 필요할 수도 있습니다.
답변1
- 그 뒤에 공백을 추가하세요
[
(명령어입니다) -n
문자열의 길이가 0이 아닌지 테스트하거나-z
0인지 테스트하는 데 사용됩니다 .- 변수 주위에 큰따옴표 추가
그래서:
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 file
regexp가 일치하면 수행됨).exp
file
이 동작은 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
.
- 열 수 없는 파일에서 리디렉션을 시도하는 것은 구문 오류입니다.(예를 들어 존재하지 않거나 유효한 UID/GID에 읽기 권한이 없습니다.)따라서
grep ... || ! printf '%s: fmt' "$param"
- 사용자 또는 파일 입력 오류로 인해 이미 호출이 이루어지기 전에 쉘이 종료되기 때문에
grep
위 형식에서 가능한 두 가지 결과는grep
최소한 한 번 패턴을 일치시키고 해당 행을 작성하거나 한 번도 일치하지 않고 0이 아닌 값을 반환합니다. 후자의 경우 정보 메시지가 기록되고 1이 반환됩니다."$finding"
stdout
printf
stderr
- 사용자 또는 파일 입력 오류로 인해 이미 호출이 이루어지기 전에 쉘이 종료되기 때문에