Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: функции тестирования в bash  (Прочитано 572 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн angul

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
функции тестирования в bash
« : 22 Октябрь 2013, 15:49:30 »
Создаю скрипт, в котором происходит тестирование на наличие папки, т.е. существует она или нет. И в зависимости от того существует она или нет, выполняются те или иные действия.

В bash для этого используются встроенные операторы тестов файлов совместно с if, такие как -d, -e, -f, -h и др.

Вот кусок моего скрипта:
...
WORKDIR="$1"
if [[ (-d $WORKDIR)&&(-e $WORKDIR) ]]; then
    action1
else
    action2
   
fi
...

скрипт отрабатывал без проблем до тех пор, пока не возникла ситуация, когда была папка FolderName (т.е. в имени присутсвуют заглавные буквы), а тестирование на наличие папки шло по имени foldername (т.е. строчными буквами).

Можно ли как-то задать тестирование на наличие папки\файла, чтобы оно не зависело от регистра в имени присутсвтующих папок\файлов?

Оффлайн kupamaan

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: функции тестирования в bash
« Ответ #1 : 22 Октябрь 2013, 15:53:53 »
Код: (bash) [Выделить]
if [ -d "$WORKDIR" ] && [ -e "$WORKDIR" ]; then
    action1
else
    action2
   
fi

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: функции тестирования в bash
« Ответ #2 : 22 Октябрь 2013, 16:07:02 »
Код: (bash) [Выделить]
if [ -d "$WORKDIR" ] ; then ... ; else ... ; fi
Цитата: man test
-d FILE
    FILE exists and is a directory
Так что проверять "-e" не нужно.

Оффлайн angul

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: функции тестирования в bash
« Ответ #3 : 23 Октябрь 2013, 07:47:46 »
Не срабатывает. Приведу пример:

1. Ту часть кода вынес в отдельный файл-скрипт:
#/bin/bash
WORKDIR="$1"
if [ -d "$WORKDIR" ]; then
 echo "Ok";
else
 echo "is away";
fi

2. В директории создал папку Folder:
ag@comp:/testscripts$ ls -l
total 8
drwxr-xr-x 2 ag ag 4096 окт.  23 09:28 Folder
-rwxr-xr-x 1 ag ag   85 окт.  23 09:32 workdir

3. Запускаю скрипт с параметром Folder:
ag@comp:/testscripts$ ./workdir Folder
Ok

Папка найдена.

4. Запускаю скрипт с параметром folder:
ag@comp:/testscripts$ ./workdir folder
is away

Папка не найдена.
 

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: функции тестирования в bash
« Ответ #4 : 23 Октябрь 2013, 08:38:16 »
Проверьте PWD в скрипте.
И ещё у вас там некорректный shebang.

Оффлайн angul

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: функции тестирования в bash
« Ответ #5 : 23 Октябрь 2013, 09:34:06 »
Проверьте PWD в скрипте.
Что под этим подразумевается? Скрипт запускается из той директории, где и происходит проверка

Цитировать
И ещё у вас там некорректный shebang.
Sha-bang поправил, спасибо.

1. Содержимое скрипта
ag@comp:/testscripts$ cat workdir
#!/bin/bash
WORKDIR="$1"
pwd
ls -l
echo
if [ -d "$WORKDIR" ]; then
 echo "$WORKDIR is Ok";
else
 echo "$WORKDIR is away";
fi

2.Запускаем проверку.
по короткому пути:
ag@comp:/testscripts$ ./workdir folder
/testscripts
total 8
drwxr-xr-x 2 ag ag 4096 окт.  23 09:43 Folder
-rwxr-xr-x 1 ag ag  113 окт.  23 11:22 workdir

folder is away

по полному пути:
ag@comp:/testscripts$ ./workdir /testscripts/folder
/testscripts
total 8
drwxr-xr-x 2 ag ag 4096 окт.  23 09:43 Folder
-rwxr-xr-x 1 ag ag  113 окт.  23 11:22 workdir

/testscripts/folder is away

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: функции тестирования в bash
« Ответ #6 : 23 Октябрь 2013, 10:11:32 »
angul, ага, я вас понял, это не баг, а фича.

Вот, смотрите:
$ mkdir Dir dir
$ ls -d Dir dir
dir  Dir
Это разные каталоги.

Оффлайн angul

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: функции тестирования в bash
« Ответ #7 : 23 Октябрь 2013, 10:26:19 »
angul, ага, я вас понял, это не баг, а фича.

Вот, смотрите:
$ mkdir Dir dir
$ ls -d Dir dir
dir  Dir
Это разные каталоги.
Да, это разные каталоги, т.к. в линуксе имена файлов регситрозависмы. Я и хотел узнать, есть ли спосособ проверки существования папки  в независимости от того, в каком регситре записано имя :)
Придется, наверное сообразить свою функцию тестирования :)

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: функции тестирования в bash
« Ответ #8 : 23 Октябрь 2013, 10:47:52 »
Код: (bash) [Выделить]
if ls | grep -qi "^$1$" ; then ... ; else ... ; fi

Оффлайн angul

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: функции тестирования в bash
« Ответ #9 : 23 Октябрь 2013, 11:48:08 »
Код: (bash) [Выделить]
if ls | grep -qi "^$1$" ; then ... ; else ... ; fi
Огромная благодарность. Этот способ действительно работает :)

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.