bash и логическое или ||
Модератор: Модераторы разделов
-
TuLiss
- Сообщения: 1611
- Статус: 01100
- ОС: Gentoo,Ubuntu,MacOS X
bash и логическое или ||
Вопрос наверно простой, но для себя я ответа не нашел.
вот простой пример
#!/usr/bin/env bash
ls /root/ || { echo "$?"; exit 1; }
echo "test ok"
Почему условием echo "test ok" будет выполнятся если взять в фигурные скобки , все что идет после || ?
Можно сделать проверку через if then, немного другой пример
if [ ! -w "/var/data/test" ]; then
mkdir -vp "$TARGET"
if [ $? -ne 0 ]; then
echo "error creating directory"
exit 1
fi
else
echo "$TARGET - The directory already exists"
fi
но выглядит это уже громоздко, хотя оно оправдано если будет выстраиваться что то вида cmd1 && cmd2 || cmd3 (поправьте меня, если я не прав)
Второй вопрос у меня будет по переменной в переменной.
OS=debian
TARGET="/home/uZer/"$OS"_stage4"
насколько правильна такая запись или может быть лучше ""/home/uZer/"$OS"_stage4"" или "/home/uZer/${OS}_stage4" ?
Как пример вот такая запись уже становится не читаема ""$HOME"/"$OS"_stage4" , куда проще прочитать "${HOME}/${OS}_stage4" .
вот простой пример
#!/usr/bin/env bash
ls /root/ || { echo "$?"; exit 1; }
echo "test ok"
Почему условием echo "test ok" будет выполнятся если взять в фигурные скобки , все что идет после || ?
Можно сделать проверку через if then, немного другой пример
if [ ! -w "/var/data/test" ]; then
mkdir -vp "$TARGET"
if [ $? -ne 0 ]; then
echo "error creating directory"
exit 1
fi
else
echo "$TARGET - The directory already exists"
fi
но выглядит это уже громоздко, хотя оно оправдано если будет выстраиваться что то вида cmd1 && cmd2 || cmd3 (поправьте меня, если я не прав)
Второй вопрос у меня будет по переменной в переменной.
OS=debian
TARGET="/home/uZer/"$OS"_stage4"
насколько правильна такая запись или может быть лучше ""/home/uZer/"$OS"_stage4"" или "/home/uZer/${OS}_stage4" ?
Как пример вот такая запись уже становится не читаема ""$HOME"/"$OS"_stage4" , куда проще прочитать "${HOME}/${OS}_stage4" .
Чтение man'нов в слух ещЁ никому не помогало!...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash и логическое или ||
это правильно. Всё остальное неправильно. (но часто работает первый вариант)
почему вы не пишете, чего ВЫ хотели? Телепаты в отпуске.
Код: Выделить всё
ls /root/
err=$?
if [ $err == 0 ]; then
echo test ok
else
echo ошибка №$err
exit $err
fiчто, "громоздко"? Могу предложить компактную программу на перле, которая избавит вас от ваших проблем.
у если вы понимаете, что
1. cmd1 выполнится всегда
2. cmd2 выполнится тогда, и только тогда, когда выполнится удачно cmd1
3. cmd3 выполнится огда, и только тогда, когда выполнится удачно cmd1 и неудачно cmd2.
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: bash и логическое или ||
Та ну.
Код: Выделить всё
$ ls /dev/brain && echo wiii || echo fail
ls: cannot access /dev/brain: No such file or directory
failконструкции if cmd1 then cmd2 else cmd3 fi и cmd1 && cmd2 || cmd3 отличаются тем, что во втором случае cmd3 имеет шанс выполниться даже в случае соблюдения условия cmd1. в конструкции с if fi это исключено. если вы это учитываете, то всё ок.
{} тоже далеко не всегда обязательно ставить. в случае с HOME оно не нужно. а вот в OS без него никуда ( иначе за переменную будет воспринято OS_stage4 целиком.
"$HOME/${OS}_stage4" вполне годно.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
TuLiss
- Сообщения: 1611
- Статус: 01100
- ОС: Gentoo,Ubuntu,MacOS X
Re: bash и логическое или ||
Для home я наверно неудачно взял, так как это объявленная переменная в системе. Можно взять, что угодно.
Значит фигурные скобки допускаются ?
Просто надо помнить что
Код: Выделить всё
T="hello world"
for s in "$T"; do echo $s; done
for s in ${T}; do echo $s; doneБудет разный вывод. Это надо учитывать.
hello world
и
hello
world
Чтение man'нов в слух ещЁ никому не помогало!...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
-
TuLiss
- Сообщения: 1611
- Статус: 01100
- ОС: Gentoo,Ubuntu,MacOS X
Re: bash и логическое или ||
SLEDopit писал(а): ↑15.04.2014 23:01Та ну.
у cmd3 шансы выполниться наоборот повышаются, а не понижаются.Код: Выделить всё
$ ls /dev/brain && echo wiii || echo fail ls: cannot access /dev/brain: No such file or directory fail
Вот поэтому если больше двух команд
cmd1 && cmd2 || cmd3,
то лучше использовать не || , а if then. Надежнее
Объясните мне все же , что выполняют фигурные скобки в данном случаи ?
cmd1 || { cmd2 ; exit 1; }
drBatty писал(а): ↑15.04.2014 22:09почему вы не пишете, чего ВЫ хотели? Телепаты в отпуске.
Код: Выделить всё
ls /root/ err=$? if [ $err == 0 ]; then echo test ok else echo ошибка №$err exit $err fi
что, "громоздко"? Могу предложить компактную программу на перле, которая избавит вас от ваших проблем.
Я не знаю, что тут непонятно ?
Почему
cmd1 || cmd2 ; exit 1;
echo "следующая команда"
неверно отрабатывается и надо писать
cmd1 || { cmd2; exit1 } ?
echo "следующая команда"
громоздко писать конструкцию, она нужна если у вас выстраивается такой cmd1 && cmd2 || cmd3
Код писать за меня не надо, вопрос не в этом.
Чтение man'нов в слух ещЁ никому не помогало!...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash и логическое или ||
ага. Вероятностное программирование.
Но в целом, да, согласен. Я просто такой быдлокод никогда не пишу. Но может кому-то и нравиться...
для переменных можно ставить, а можно не ставить. Как хотите.
Обязательно _нужно_ ставить скобки в ${X}Y тогда, и только тогда, когда Y это буква, цифра, или "_". Но если сомневаетесь, то лучше поставьте. ИМХО со скобками читать легче.
при чём тут скобки-то? В первой строке есть кавычки, а во второй их нет. Потому и по разному.
гвоздь забитый молотком сидит надёжнее, чем гвоздь закрученный отвёрткой.
а что значит ☣ в моих постах?
-
bormant
- Сообщения: 1354
Re: bash и логическое или ||
Они всем показывают, что man bash не читан. А между тем там:
{ список; }
Список выполняется в среде текущего командного интерпретатора. Список должен завершаться переводом строки или точкой с запятой.
Эту команду называют командой группировки. Статусом возврата является статус выхода списка.
Спасибо сказали:
-
TuLiss
- Сообщения: 1611
- Статус: 01100
- ОС: Gentoo,Ubuntu,MacOS X
Re: bash и логическое или ||
bormant писал(а): ↑16.04.2014 14:03Они всем показывают, что man bash не читан. А между тем там:{ список; }
Список выполняется в среде текущего командного интерпретатора. Список должен завершаться переводом строки или точкой с запятой.
Эту команду называют командой группировки. Статусом возврата является статус выхода списка.
Вот за это спс. Видно я это просто проморгал.
В первой строке есть кавычки, но нет фигурных скобок. Во второй есть фигурные скобки, кавычек нет.
Поэтому ответ и разный - это хороший ответ. Ваш КО.
Вот вы зря так, я тут сделал поиск по примера - и вот попадаются авторы с
echo "hello world!"
Чтение man'нов в слух ещЁ никому не помогало!...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
-
Bizdelnick
- Модератор
- Сообщения: 21497
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: bash и логическое или ||
От наличия/отсутствия фигурных скобок ничего бы в данном случае не изменилось. Ответ разный именно из-за кавычек.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: bash и логическое или ||
Дело не в надёжности, а в том, какой результат преследуются. Иногда if fi не годится, а нужно именно && && || .
Отрабатывается она как написано. Просто вы ожидаете не тот результат. Впрочем про {} уже объяснили. Можно ещё использовать конструкцию cmd1 || cmd2 && exit 1 , но exit 1 может не сработать, если cmd2 свалится с ошибкой.
Ответ совершенно верный между тем. Кавычки экранируют пробелы и прочие разделители и они не игнорируются for'ом. Когда кавычек нет, то пробел воспринимается как разделитель и hello обрабатывается отдельно от world. А наличие фигурных скобок на результат не влиет.
upd. Что-то я долго писал ответ..
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash и логическое или ||
повторяю, {скобки} тут не при чём, и на результат НЕ влияют. Вывод разный из-за кавычек.
$
$ cat >t
echo "hello world!"
$ bash t
hello world!
УМВР, ЧЯДНТ?
пример?
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: bash и логическое или ||
Код: Выделить всё
download file && process file && send file to remote || echo file skippedUNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash и логическое или ||
и почему это нельзя оформить например функцией с if и return?