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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Вопрос по bash, condition && command1 || command2  (Прочитано 1131 раз)

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

Оффлайн Тандем

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Вопрос по bash, condition && command1 || command2
« : 19 Ноября 2012, 19:24:08 »
Понравилась короткая форма условий в bash
Например:
#!/bin/bash
echo "start"
[ -f $1 ] && echo "ok" || exit 1
echo "working"
В случае ошибки (отсутствия файла) прерываем выполнение скрипта.
Теперь пытаюсь добавить сообщение об ошибке перед выходом из скрипта.
#!/bin/bash
echo "start"
[ -f $1 ] && echo "ok" || echo "error: no file" && exit 1
echo "working"
Сообщения выводятся корректно, в зависимости от существования файла. А вот последнее эхо не срабатывает, следовательно прерывание выполнения скрипта происходит в любом случае. Почему? Вроде всё должно работать, && имеет приоритет перед ||, следовательно "exit 1" вообще не может выполнится без выполнения "echo "error". Где ошибка?

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Вопрос по bash, condition && command1 || command2
« Ответ #1 : 21 Ноября 2012, 10:36:55 »
4-я команда выполняется при любом раскладе:
Код: (bash) [Выделить]
$ true && echo 1 || echo 2 && echo 3
1
3

$ false && echo 1 || echo 2 && echo 3
2
3

Причина в последовательном исполнении:
Код: (bash) [Выделить]
$ ( ( true && echo 1 ) || echo 2 ) && echo 3
1
3

$ ( ( false && echo 1 ) || echo 2 ) && echo 3
2
3

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Вопрос по bash, condition && command1 || command2
« Ответ #2 : 21 Ноября 2012, 12:47:14 »
true && echo 1 || ( echo 2 && echo 3)
1
false && echo 1 || ( echo 2 && echo 3)
2
3

Оффлайн Тандем

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопрос по bash, condition && command1 || command2
« Ответ #3 : 06 Декабря 2012, 12:36:51 »
Спасибо. Задумку удалось реализовать вот так, обратив условие
[ ! -f $1 ] && echo "false.exit" && exit 1 || echo "true.continue"сс# ./test file
start
true.continue
continue
сс# ./test nosuchfile
start
false.exit
Получается однострочная проверка условия, сообщение+выход в случае ошибки.

 

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