2017-02-21 22 views
2

Я создаю скрипт для своей школы, и мне было интересно, как я могу проверить файл, и если строка отсутствует в файле, выполните код, но если это , по-прежнему, как это:Хотя файл не содержит строки BASH

while [ -z $(cat File.txt | grep "string") ] #Checking if file doesn't contain string 
do 
    echo "No matching string!, trying again" #If it doesn't, run this code 
done 
echo "String matched!" #If it does, run this code 
+1

... Так что ваш вопрос –

ответ

4

Вы можете сделать что-то вроде:

$ if grep "string" file;then echo "found";else echo "not found" 

чтобы сделать петлю:

$ while ! grep "no" file;do echo "not found";sleep 2;done 
$ echo "found" 

Но будьте осторожны, чтобы не вводить бесконечный цикл. строка или файл должны быть изменены, иначе цикл не имеет значения.

Выше if/while работает на основе состояния возврата команды, а не результата. Если grep находит строку в файле, возвращается 0 = success = true , если grep не находит строку, возвращается 1 = not success = false

Использование! мы возвращаем «false» в «true», чтобы поддерживать цикл с тех пор, пока циклы на чем-то, как только это правда.

Более обычный в то время как цикл будет похож на код, но без бесполезного использования кошки и дополнительной трубы:

$ while [ -z $(grep "no" a.txt) ];do echo "not found";sleep 2;done 
$ echo "found" 
+0

Это то, что я думал, но я? хотел бы, чтобы он продолжал печатать «не найден», пока строка не будет найдена. –

+0

@Python обновлен –

+0

@Python обновлен и объяснен. Это то, что вы ищете ... –

2

Простой, если заявление, чтобы проверить, если «строка» не в file.txt:

#!/bin/bash 
if ! grep -q string file.txt; then 
    echo "string not found in file!" 
else 
    echo "string found in file!" 
fi 

-q вариант (--quiet, --silent) обеспечивает выход не записывается в стандартный вывод.

Простой в то время как петля для теста является «строка» не в file.txt:

#!/bin/bash 
while ! grep -q string file.txt; do 
    echo "string not found in file!" 
done 
echo "string found in file!" 

Примечание: знать о возможности того, что цикл в то время как может вызвать бесконечный цикл!

+0

@ В чем отличие от моего человека решения? –

+1

Без опции '-q' для' grep' строка будет напечатана на стандартный вывод, если найден. –

0

Другой простой способ это просто сделать следующее:

[[ -z $(grep string file.file) ]] && echo "not found" || echo "found" 

&& средства и - или выполнить следующую команду, если предыдущий является истинные

|| средства или - или, если предыдущий выполнить is false

[[ -z $(expansion) ]] означает возвращение true если выходное расширение нуль

Эта линия так же, как двойное отрицание, в основном: «вернуть истинную, если строка не найдена в файле.файл; то эхо не найден если правда или нашел если ложные "

Пример:

bashPrompt:$ [[ -z $(grep stackOverflow scsi_reservations.sh) ]] && echo "not found" || echo "found" 
not found 
bashPrompt:$ [[ -z $(grep reservations scsi_reservations.sh) ]] && echo "not found" || echo "found" 
found 
Смежные вопросы