Скрипты Bash "[!: Not found" и как написать оператор или - PullRequest
3 голосов
/ 30 ноября 2009

EDIT: Вот мой обновленный код:

#!/bin/sh
files=`ls`
if [ $# -ne 1 -o -f $1 ]
then
        echo "Usage: $0 <directory>"
        exit 1
fi
if [ ! -e $1 ]
then
        echo "$1 not found"
        exit 1

elif [ -d $1 ]
then
cd $1

for f in $files
do
        if [ ! -d "$f" ]
        then
           if [ ! -s "$f" ]
            then
              rm -r "$f"
        echo "File: $f was removed."
        else
        continue
        fi
fi
done


echo "Name\t\tLinks\t\tOwner\t\tDate"

for f in $files
        do
                find "$f" -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
        done
        exit 0
fi

Я исправил все проблемы с пробелами, изменил #! Bin / sh на # / bin / bash и добавил кавычки в "$ f". Однако я все еще получаю много ошибок.

ava @ kosh: ~ / test $ ./delDir d1 rm: невозможно удалить d1': No such file or directory File: d1 was removed. rm: cannot remove delDir ': такого файла нет или файл каталога: delDir был удален. rm: невозможно удалить delDir2': No such file or directory File: delDir2 was removed. rm: cannot remove e1 ': нет такой файл или каталог File: e1 был удален. rm: не может удалить e2': No such file or directory File: e2 was removed. rm: cannot remove make_d1 ': Нет такого файла или каталога File: make_d1 был удален Имя \ t \ tLinks \ t \ tOwner \ t \ tНайдите дату: d1: такого файла или каталога не найдено: delDir: нет такого файла или каталога найти: delDir2: нет такого файла или каталог найти: e1: нет такого файла или каталог найти: e2: нет такого файла или каталог найти: make_d1: нет такого файла или каталог ne1 2
ava 22 ноября 2009 г. ne2
2 апреля 22 ноября 2009 г.

Кто-нибудь знает, что еще я делаю не так?

Вот мой код:

#!/bin/sh
files=`ls`
if [ $# -ne 1 ]
then
        echo "Usage: $0 <directory>"
        exit 1
fi
if [ ! -e $1 ]
then
        echo "$1 not found"
        exit 1

elif [ -d $1 ]
then
cd $1

for f in $files
do
        if [! -d $f]
        then
           if [ ! -s $f ]
            then
              rm-r $f
        echo "File: $f was removed."
        else
        continue
        fi
fi
done


echo "Name\t\tLinks\t\tOwner\t\tDate"

for f in $files
        do
                find $f -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
        done
        exit 0
fi

Вот мои вопросы:

  1. Если я выполню скрипт с чем-то, что НЕ является обычным файлом И не каталог, я хочу это скажем "Использование: каталог с именем файла" (см. строка 5). Я знаю, что могу сделать это с 2 если заявления, но возможно ли создать или заявление для этого в Баш

  2. Когда я запускаю скрипт, я получаю сообщения об ошибках вроде этого:

. / DelDir: 39: [!: Не найдено ./delDir: 39: [!: Не найдено ./delDir: 39: [!: Не найдено ./delDir: 39: [!: не найден ./delDir: 39: [!: не найден ./delDir: 39: [!: не найден ./delDir: 39: [!: Не найдено ./delDir: 39: [!: не найден ./delDir: 39: [!: не найден ./delDir: 39: [!: не найдено Имя
Ссылки Владелец Дата найти: d1: нет такого файла или каталога найти: delDir: нет такого файла или каталог найти: delDir2: нет такого файла или каталог e1 1
ava 22 ноября 2009 e2
1 августа 22 ноября 2009 г. найти: make_d1: нет такого файла или каталог ne1 2
ava 22 ноября 2009 г. ne2
2 авг 22 ноября 2009

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

Ответы [ 6 ]

10 голосов
/ 30 ноября 2009

Вы забыли поставить пробел после [ и до ] в строке, говоря:

if [! -d $f]

И тесты создаются с использованием -a, -o равно ИЛИ:

if [ ! -d $f -a -f $f ]
if [ ! -d $f -o -f $f ]
5 голосов
/ 30 ноября 2009

Попробуйте поставить пробел между [ и !.

4 голосов
/ 30 ноября 2009

Другая проблема заключается в том, что при запуске скрипта вы делаете

files = `ls`

но затем вы переходите в другой каталог и пытаетесь зациклить $ файлы, удаляя их - конечно, это не будет работать, так как вы изменили каталоги.

переместить строку ls после того, как вы изменили каталог.

2 голосов
/ 30 ноября 2009

Я дополняю другие ответы здесь ... каждый раз, когда я вижу вопрос о bash, начинающийся с #! /bin/sh Я должен прыгнуть, это моральный долг.

Имейте в виду, что /bin/sh указывает на POSIX-вызов bash или совершенно другой «посиксельно правильной» оболочки, такой как dash. / bin / sh часто является символической ссылкой, из-за которой bash меняет свое поведение, чтобы быть более совместимым с POSIX. Следовательно, многие вкусности не будут работать как обычно, или вы можете обнаружить, что ваш код анализируется другой оболочкой.

Другими словами, / bin / sh == POSIX_ME_HARDER , но .. yikes! == это башизм :)

Если вы хотите bash, используйте #!/bin/bash

Кроме того, ответ поющего волка должен решить вашу непосредственную проблему:)

2 голосов
/ 30 ноября 2009

Другие ответы верны, вот почему: [это команда. Если вы введете «[!», Оболочка выполнит поиск команды с таким именем.

1 голос
/ 30 ноября 2009

У остальных возникла проблема с интервалом [, но я заметил еще пару вещей.

В вашей команде rm в строке 23 вам, вероятно, нужен пробел:

rm -r $f

Кроме того, обычно хорошей практикой является двойная кавычка путей к файлам. Это позволит вашему сценарию правильно обрабатывать имена файлов с пробелами и другими специальными символами.

rm -r "$f"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...