23 - bash. Объединение команд

Лекция



Сразу хочу сказать, что здесь никакой воды про bash объединение команд, и только нужная информация. Для того чтобы лучше понимать что такое bash объединение команд, bash , настоятельно рекомендую прочитать все из категории Операционная система LINUX.

На этой лекции мы продолжаем изучать bash. Сегодня поговорим об объединении команд в bash, о конструкцииcase и некоторых других командах. Но сначала о незаслуженно забытой на прошлой лекции конструкции case.

case

case удобнее использовать для ветвления, когда значение необходимо проверять на точное соответствие и оно может принимать три и более значений. Вместо case можно было бы использовать if, но такие конструкции выглядят громоздко и их не так удобно “читать” в скриптах.

Общий синтаксис команды case следующий:

case значение in
(шаблон)
блок команд
;;
(шаблон)
блок команд
;;
...
...
(шаблон)
блок команд
;;
esac

Для нас case важна еще и потому, что содержится во всех скриптах каталога /etc/init.d/. В качестве шаблона могут указываться буквы, цифры, строки и шаблоны вида [a-z][1-9], а также ? - один любой символ и * - любая комбинация. Хотя шаблон в общем синтаксисе указан в круглых скобках, на практике разрешается первую скобку не писать. Давайте рассмотрим практический пример:

#!/bin/bash
case $1 in
[a,b,c,d])                    #значения заданные в шаблоне явно
        echo "a b c d"
        ;;
[0-9])                         #последовательность числовых значений
        echo "Это цифра $1"
        ;;
[a-z])                          #последовательность 
        echo "Это буква $1"
        ;;
??)
        echo "Это два любых символа"
        ;;
stop|restart|start)
        echo "Это слово stop или restart или start"
        ;;
*)
        echo "Другое значение"
        ;;
esac

В качестве значения здесь использована конструкция $1, которая содержит первый передаваемый скрипту параметр. На прошлой лекции мы говорили, что параметры можно передавать не только функции, но и скрипту. Значение начинает сверятся с шаблонами сверху вниз и как только будет найдено соответствие, будет выполнен блок команд между шаблоном и ;;. Пример работы скрипта:

1
2
3
4
5
6
7
8
9
10
igor@adm-ubuntu:~/linux$ ./case.sh a
a b c d
igor@adm-ubuntu:~/linux$ ./case.sh k
Это буква k
igor@adm-ubuntu:~/linux$ ./case.sh qq
Это два любых символа
igor@adm-ubuntu:~/linux$ ./case.sh 1
Это цифра 1
igor@adm-ubuntu:~/linux$ ./case.sh start
Это слово stop или restart или start

В каталоге /etc/init.d/ расположены скрипты управления службами Linux. С помощью case в них реализован механизм обработки передаваемых скрипту параметров: startstoprestartreload и других. Ниже фрагмент скрипта /etc/init.d/reboot:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case "$1" in
  start)
        # No-op
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
  stop)
        do_stop
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

Подобный case вы найдете в каждом скрипте каталога /etc/init.d/.

Объединение команд

Я уже говорил, что если в одной строке скрипта мы пишем два ключевых слова какой либо конструкции, то их нужно разделять символом ;. Точка с запятой и есть простейший способ объединения команд (ключевые слова тоже воспринимаются bash как команды). Команды записанные таким образом будут выполняться последовательно в независимости от результата выполнения предыдущей команды. Примеры ниже можно набирать как в командной строке так и в скрипте.

1
2
3
4
igor@adm-ubuntu:~/linux$ a=127; echo $a; b=172; echo $b; let c=$a+$b; echo $c
127
172
299

Как видите из примера на одной строке размещено 6 команд, которые были выполнены последовательно.

Для параллельного запуска команд используют уже знакомый вам амперсанд &. Об этом говорит сайт https://intellect.icu . Такие команды будут запущены в фоновом режиме и выполняться будут параллельно.

1
2
3
4
igor@adm-ubuntu:~$ sleep 10& sleep 10& echo Hello!
[1] 8043
[2] 8044
Hello!

Дальше уже более интересные конструкции. После своего выполнения любая команды возвращает числовой код результата выполнения команды. Если это 0 - значит команда выполнена успешно, если это число отличное от нуля - значит команда завершилась с ошибкой. Можно строить выполнение последовательности команд учитывая этот момент. Для этого существуют следующие элементы: двойной амперсанд - && и двойной “пайп” - ||. Если объединение команд происходит только через &&, то каждая следующая команда будет выполняться, только в случае успешного завершения предыдущей команды. Как только какая либо команда цепочки вернет код возврата отличный от нуля, следующие после нее команды не будут выполнены. Для примера воспользуемся командами true (всегда возвращает 0) и false (всегда возвращает 1).

1
2
igor@ubuntu:~$ true && echo "1" && false && echo "2"
1

В примере команда true вернула 0 и следующая команда echo “1″ была выполнена и тоже вернула 0, после чего была выполнена команда false, которая вернула 1 и выполнение команд прекратилось (команда echo 2 не выполнилась).

Команда || работает с точностью до наоборот. То есть следующая команда будет выполнена только в том случае, если предыдущая команда вернула код возврата отличный от нуля (правило действует в таком виде если все команды объединены только ||). Если команда вернула 0, то выполнение дальнейшей цепочки команд прерывается. Если в примере выше заменить && на ||, то выполнится только команда true, которая вернет 0 и дальнейшие команды не будут выполнены. Если заменить true на false, то получим такой же результат:

1
2
igor@ubuntu:~$ false || echo "1" || false || echo "2"
1

Комбинируя && и || можно строить довольно сложные варианты объединения команд. Но в этому случае нужно глубже понимать, как происходит выполнение команд при таком объединении.

Рассмотрим два примера объединения команд и на результат их выполнения:

1
2
3
4
5
igor@ubuntu:~$ false || echo "1" || false || echo "2"
1
igor@ubuntu:~$ false || echo "1" || false && echo "2"
1
2

В первом варианте команда false вернет код 1, и будет выполнена следующая команда echo “1″, которая вернет код выполнения 0. И далее цепочка команд прерывается как и описано выше. Во втором случае должна быть, такая же ситуация, но команда echo “2″ выполняется. Все дело в том, что на самом деле происходит проверкавсех операторов объединения, которые участвуют в цепочке. Если команда вернула 1, а все дальнейшие операторы объединения && - то поэтому и не будет выполнена ни одна команда. Но если в цепочке встретиться оператор ||, то команда после него будет выполнена и проверка будет идти дальше.

Рассмотрим более подробно эту цепочку:

1) Выполняется команда false и возвращает код выполнения 1
2) Далее стоит оператор ||, а значит следующая команда будет выполняться
3) Выполняется команда echo “1″ и возвращает код 0
4) Далее стоит оператор ||, а значит следующая команда не будет выполнятся
5) Проверяется следующий оператор - это оператор &&, значит следующая команда (echo “2″) будет выполнена.

Посмотрите еще несколько примеров:

1
2
igor@ubuntu:~$ true || echo "1" && false || echo "2"
2
1
2
3
igor@ubuntu:~$ true && echo "1" || false && echo "2"
1
2
1
2
3
igor@adm-ubuntu:~/linux$ true || echo "1" || echo "2" || echo "3" || false && echo "4" && echo "5" || echo "6"
4
5

Команды можно объединять в блоки с помощью круглых скобок:

1
2
3
4
igor@adm-ubuntu:~/linux$ true || echo "1" && (echo "2"; echo "3" || echo "4") && echo "5" || echo "6"
2
3
5

или фигурных:

1
2
3
4
igor@adm-ubuntu:~/linux$ true || echo "1" && { echo "2"; echo "3" || echo "4"; } && echo "5" || echo "6"
2
3
5

Во втором случае фигурные скобки обязательно должны быть между пробелами, и после последней команды должна идти точка с запятой.

Отличия между круглыми и фигурными скобками в том, что команды в фигурных скобках выполняются в рамках того же процесса, что и скрипт, а команды в круглых скобках выполняются как бы в своем подпроцессе. Посмотрим пример скрипта:

1
2
3
4
#!/bin/bash
true && (echo a; sleep 1 && exit 0 || echo b) && echo c
echo d
echo e

и результат выполнения:

1
2
3
4
5
igor@adm-ubuntu:~/linux$ ./script.sh 
a
c
d
e

А теперь такой же пример с фигурными скобками:

1
2
3
4
#!/bin/bash
true && { echo a; sleep 1 && exit 0 || echo b; } && echo c
echo d
echo e

и результат его выполнения:

1
2
igor@adm-ubuntu:~/linux$ ./script.sh 
a

В первом случае команда exit прервала выполнение команд расположенных в круглых скобках, но не скрипта в целом. Во втором случае происходит остановка всего скрипта.

В завершении лекции еще несколько команд.

Если из скрипта необходимо запустить исполняемый файл, достаточно написать имя файла (если он расположен в каталоге описанном в переменной PATH) или полный путь к файлу если он расположен в специфическом каталоге:

1
/home/igor/linux/testscript.sh

В этом случае будет запущен файл testscript.sh, а выполнение текущего скрипта будет приостановлено и возобновлено после завершения работы вызванного скрипта. Если необходимо, чтобы при вызове нового скрипта или программы текущий скрипт завершал работу, то вызывать его нужно с помощью команды exec.

1
2
3
4
...
exec /home/igor/linux/testscript.sh
echo "1"
echo "2"

При таком варианте запуска команды echo 1 и echo 2 выполнены не будут, так как после exec /home/igor/linux/testscript.sh скрипт завершит свою работу.

Также работу скрипта можно в любом месте прервать командой exit. Желательно при этом указать код результата выполнения скрипта. Например, exit 0.

Пожалуйста, пиши комментарии, если ты обнаружил что-то неправильное или если ты желаешь поделиться дополнительной информацией про bash объединение команд Надеюсь, что теперь ты понял что такое bash объединение команд, bash и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Операционная система LINUX

создано: 2014-09-13
обновлено: 2021-01-10
361



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Операционная система LINUX

Термины: Операционная система LINUX