Bash мой скрипт, пожалуйста
Сценарий сам по себе довольно понятен. Можно ли улучшить этот сценарий?
Первая итерация была написана на OS X 10.5.8 Leopard, текущая итерация была запущена на OS X 10.6.4 Snow Leopard с Safari 5.0.2 (6533.18.5). Кроме того, любое освещение относительно того, почему первая строка ' if [ -f ] ' работает, но ' if [ -f ~/Library/Safari/LocalStorage/*. Localstorage ] ' генерирует ошибку? [да, я немного нуб]
Код:
#! /bin/bash
# SafariClear0.0.6
if [ -f ]
then
cat /dev/null > ~/Library/Safari/LocalStorage/*.localstorage
rm -f ~/Library/Safari/LocalStorage/*.localstorage
fi
if [ -f ~/Library/Safari/LocalStorage/*.localstorage ]
then
echo "Oy vey!"
fi
cd ~/Library/Safari/
cat /dev/null > WebpageIcons.db
cat /dev/null > TopSites.plist
cat /dev/null > LocationPermissions.plist
cat /dev/null > LastSession.plist
cat /dev/null > History.plist
echo "Clear"
exit
2 ответа
Похоже, что это будет закрыто, не знаю почему, может быть, потому что это вопрос программирования для Superuser.
1) тест [ -f ] не имеет смысла. Тест -f предназначен для проверки того, существует ли файл и существует ли он. Наличие -f без файла ничего не делает.
2) Узнать, что "каталог содержит один или несколько файлов" сложнее, чем кажется на первый взгляд. К счастью, вам не нужно. Смотрите № 3 ниже.
3) Первый фрагмент кода усекает файлы, которые вы затем удаляете. Зачем вообще усекать? Просто удалите их и покончите с этим. Ты можешь сделать:
find ~/Library/Safari/LocalStorage/ -type f -name '*.localstorage' -exec rm -f {} \;
4) Затем вы обрезаете некоторые другие файлы. Это может быть зациклено, что может быть улучшением.
cd ~/Library/Safari/
for FILE in WebpageIcons.db TopSites.plist LocationPermissions.plist LastSession.plist History.plist
do
cat /dev/null > $FILE
done
Объединение этих двух фрагментов кода в скрипт делает все, что делает ваш скрипт.
В [ -f *.txt ]
,
- Если такого файла не существует,
- если опция оболочки
nullglob
не включено (по умолчанию) слово*.txt
остается нерасширенным, и-f
оценивается как ложное. - если опция оболочки
nullglob
включен, слово*.txt
удаляется, оставляя[ -f ]
, что эквивалентноtest -f
, Поскольку задан только 1 аргумент, правило состоит в том, что выражение является истинным тогда и только тогда, когда аргумент не равен нулю.-f
не является нулевым, поэтому выражение верно.
- если опция оболочки
- Если такие файлы существуют,
*.txt
расширен до списка их имен.- Если существует только один такой файл,
-f
видит имя файла и оценивает как true. - Если существует два таких файла, ожидается, что третьим аргументом будет бинарный оператор (
-a
или же-o
), и вы, вероятно, получитеbinary operator expected
ошибка. - Если существует три или более таких файлов, вы получите
too many arguments
ошибка.
- Если существует только один такой файл,
Чтобы проверить, существуют ли файлы, соответствующие шаблону, посмотрите эту ветку.