оператор if с grep [duplicate]

Вам не хватает /*после $WEBROOT, и может быть cdотсутствует:

for vhost in "$WEBROOT"/*/; do
  base=$(basename "$vhost")
  ( cd "$WEBROOT" && tar -czf "$BAKPATH/$(date +%F)_$base.tar.gz" "$base" )
done

/после "$WEBROOT/*гарантирует, что мы сопоставляем только каталоги.

Это создаст архивы в $BAKPATH, которые будут иметь $baseв качестве верхнего уровня. level


Следующее почти полностью эквивалентно:

find "$WEBROOT" -mindepth 1 -maxdepth 1 -type d \
    -execdir tar -czf "$BAKPATH/$(date +%F)"_{}.tar.gz {} \;
0
24.11.2018, 22:32
2 ответа
read -r -p 'Enter pattern: ' pattern

result=$( grep -e "$pattern" records )

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi
  • Присвоениеsearch(resultв моем коде )лучше всего выполнять вне оператора if.

  • Проверка с помощью-n("эта строка не -пуста?" )о результате.

  • Не заключайте переменную (в одиночные -кавычки, это не позволит оболочке расширять ее значение ). Вместо этого двойная цитата.

  • Обратите внимание на «шаблон», а не на «ключевое слово». То, как вы используете grepздесь, будет использовать предоставленную пользователем -строку как регулярное выражение (шаблон, такой как cat.*dog), не обязательно как простую фиксированную строку.

  • catследует использовать для объединения файлов, в большинстве других случаев это более или менее бесполезно.

  • Используйте read -r, чтобы разрешить пользователю вводить обратную косую черту.


В качестве альтернативы:

read -r -p 'Enter pattern: ' pattern

if ! grep -e "$pattern" records; then
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

Это позволяет избежать хранения потенциально огромного количества данных в переменной оболочки и вместо этого полагаться на статус выхода grep, чтобы определить, может ли шаблон быть найден в файле или нет. Если шаблон найден, будут напечатаны совпадающие строки (и больше ничего делать не нужно ).

Относительно использования printfвместоecho:Почему printf лучше, чем echo?


Более короткий, с использованием короткой -цепи ИЛИ.

read -r -p 'Enter pattern: '

grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"
3
28.01.2020, 02:33

См. ниже:

read -p "Enter keyword: " keyword

if search=$(grep "$keyword"./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
  1. Не используйте цитирование с $(), как было указано выше @jasonwryan
  2. Нет необходимости использовать трубопровод catс grep.Используйте grep <pattern> fileвместо
  3. Удалить ;;послеfi
1
28.01.2020, 02:33

Теги

Похожие вопросы