Что вам нужно понять, так это то, что -name в 'find' на самом деле является 'basename' Следовательно, чтобы получить фактическое имя файла мы можем запустить вложенный поиск, в котором мы сначала находим каталог с именем «метаданные», а затем ищем любые файлы * .xml в указанном каталоге:
find . -type d -name metadata -exec sh -c '
shift $1;
while case $# in 0 ) break;; esac; do
find "${1}/." ! -name . -prune -type f -name \*.xml
shift
done
' 2 1 {} +
От grep
man page:
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 истинно (потому что стандартный статус «успешного» выхода программ равен 0), у вас должно быть что-то вроде:
#!/bin/bash
while grep "sunday" file.txt > /dev/null;
do
sleep 1
echo "working..."
done
Почему именно вы передаете спящий режим 1
на эхо
? Хотя это работает, в этом нет особого смысла. Если вы хотите, чтобы они были встроены, вы можете просто написать sleep 1; echo "работает ..."
, и если вы хотите, чтобы echo
запускалось до задержки, вы можете запустить его до вызова sleep
, как echo ", работающего. .. "; сон 1
.
Это должно сработать:
#!/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
У меня работает следующее, я не знаю, почему цикл 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