이 스크립트의 일부로 주어진 첫 번째 인수가 파일의 첫 번째 단어와 일치하는지 확인할 수 있어야 합니다. 그렇다면 오류 메시지와 함께 종료하고, 그렇지 않은 경우 매개변수를 파일에 추가합니다. 해당 문장을 작성하는 방법은 이해 하지만 스크립트에서 사용하는 if
방법은 이해하지 못합니다 . grep
나도 grep
이렇게 생겼단 걸 알아
grep ^$1 schemas.txt
나는 이것이 내가 한 것보다 훨씬 쉬울 것이라고 생각합니다.
명령문에 "매개변수가 너무 많습니다"라는 오류가 표시됩니다 if
. 공백을 제거한 grep -q
다음 이진 연산자에 대해 예상되는 오류가 발생했습니다.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
답변1
grep
무언가가 발견된 경우(0)와 아무것도 발견되지 않은 경우(0이 아님) 다른 종료 코드를 반환합니다. if
명령문 내에서 0 종료 코드는 "true"로 매핑되고 0이 아닌 종료 코드는 false로 매핑됩니다. 또한 grep에는 -q
일치하는 텍스트를 출력하지 않고 종료 상태 코드만 반환하는 매개변수가 있습니다.
따라서 다음과 같이 grep을 사용할 수 있습니다.
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
간단히 말해서, 이와 같은 작업을 수행하면 이것이 실제로 grep과 같이 실행 중인 명령 if [ -z "$var" ]…
이라는 것이 밝혀집니다 . [
내 시스템에서는 /usr/bin/[
. 동일한 방식으로 작동하여 [
true에 대해 0 종료 코드를 반환하고 false에 대해 0이 아닌 종료 코드를 반환합니다. ( 결론을 제외하고 test
와 동일 )[
]
답변2
또 다른 쉬운 방법은 를 사용하는 것입니다 grep -c
.
출력(종료 코드로 반환되지 않음)은 패턴과 일치하는 줄 수이므로 일치하는 항목이 없으면 0이고 일치하는 항목이 있으면 1 이상입니다.
따라서 패턴이 3번 이상 일치하는지 확인하려면 다음을 수행할 수 있습니다.
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
답변3
늦었다는 건 알지만 다음 짧은 버전이 마음에 듭니다.
grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
답변4
오래된 게시물이지만 실제로 답변이 제공되지 않았습니다.
예, 패턴이 발견되면 Grep은 0(true)을 반환하고, 패턴을 발견하지 못하면 Grep은 1(false)을 반환합니다. grep은 줄 기반이므로 모든 작업을 수행할 것이라고 생각하는 검색어는 아마도 많은 정크 히트를 가져올 수 있다는 점을 명심하세요. 구문 분석 방법은 여러분에게 맡기겠습니다. $? 종료 상태입니다. 파일에서 읽는 대신 파이프를 사용하는 것이 내 스크립트에 더 적합하기 때문에 선호합니다. 나는 다음을 사용합니다 :
{cat/cut/echo/curl/whatever} | grep -q 모드 에코 $?
위의 값이 0을 반환하면 패턴을 찾은 것이고, 1을 반환하면 패턴을 찾지 못한 것입니다.
이는 프로세스를 모니터링하고 특정 스크립트가 종료된 경우 활성 상태를 유지하거나 완료되면 알림을 보내기 위해 while 루프에 넣기 때문에 유용합니다.