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 ошибка.

Чтобы проверить, существуют ли файлы, соответствующие шаблону, посмотрите эту ветку.

Другие вопросы по тегам