이라는 파일이 있습니다 file.txt
. 내용은 다음과 같습니다.
sunday
monday
tuesday
grep
언급된 패턴을 찾을 수 없으면 잘 반복되는 다음 스크립트를 작성했습니다.
until cat file.txt | grep -E "fdgfg" -C 9999; do sleep 1 | echo "working..."; done
하지만 내 요구 사항은 위의 스크립트가 패턴에 언급된 텍스트가 grep
사라질 때까지 반복되어야 한다는 것입니다. file.txt
나는 L
grep에서 이 플래그를 사용해 보았습니다. 그러나 그것은 작동하지 않았습니다.
until cat file.txt | grep -EL "sunday" -C 9999; do sleep 1 | echo "working..."; done
답변1
grep
매뉴얼 페이지 에서 :
EXIT STATUS
Normally the exit status is 0 if a line is selected, 1 if no lines were
selected, and 2 if an error occurred. However, if the -q or --quiet or
--silent is used and a line is selected, the exit status is 0 even if
an error occurred.
따라서 행이 존재하면 종료 상태는 0입니다. Bash에서는 0이 true이기 때문에(프로그램의 표준 "성공" 종료 상태가 0이기 때문에) 실제로 다음과 같은 내용이 있어야 합니다.
#!/bin/bash
while grep "sunday" file.txt > /dev/null;
do
sleep 1
echo "working..."
done
도대체 왜 sleep 1
파이프라인을 원하는 걸까요 echo
? 작동하는 동안에는 별 의미가 없습니다. 인라인으로 만들고 싶다면 그냥 쓸 수 있고 , 지연되기 전에 실행되도록 sleep 1; echo "working..."
하려면 다음과 같이 호출 앞에 넣을 수 있습니다 .echo
sleep
echo "working..."; sleep 1
답변2
이 작업을 수행해야 합니다.
#!/bin/bash
while true ; do
echo "Working..."
result=$(grep -nE 'sunday' file.txt) # -n shows line number
echo "DEBUG: Result found is $result"
if [ -z "$result" ] ; then
echo "COMPLETE!"
break
fi
sleep 1
done
답변3
다음은 나에게 효과적이었습니다. while 루프가 작동하지 않는 이유를 모르겠습니다.
until echo "$(kubectl -n production get pods -l=app='activemq' -o jsonpath='{.items[*].status.containerStatuses[0].ready}')" | grep -q "true"; do
sleep 10
echo "Waiting for Broker to be ready......................."
done