Вам не хватает /*
после $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 {} \;
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"
См. ниже:
read -p "Enter keyword: " keyword
if search=$(grep "$keyword"./records)
then
echo "$search"
else
echo "$keyword not found!"
fi
$()
, как было указано выше @jasonwryan cat
с grep
.Используйте grep <pattern> file
вместо ;;
послеfi