Библиотека сайта rus-linux.net
Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
Оригинал: Linux FundamentalsАвтор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.
Глава 11. Операторы управления
В данной главе мы будем учиться размещать более одной команды в командной строке, используя для этого операторы управления
. Также мы кратко обсудим связанные с этими операторами параметры ($?) и вопросы использования аналогичных операторам специальных символов (&).
Точка с запятой (;)
;
. Командная оболочка будет исследовать строку команды до момента достижения символа точки с запятой. Все аргументы перед этим символом точки с запятой будут рассматриваться как аргументы, не относящиеся к команде, находящейся после символа точки с запятой. Все команды с наборами аргументов будут выполнены последовательно, причем командная оболочка будет ожидать завершения исполнения каждой из команд перед исполнением следующей команды.
[paul@RHELv4u3 ~]$ echo Hello Hello [paul@RHELv4u3 ~]$ echo World World [paul@RHELv4u3 ~]$ echo Hello ; echo World Hello World [paul@RHELv4u3 ~]$
Амперсанд (&)
&
, командная оболочка не будет ожидать завершения исполнения этой команды. Сразу же после ввода команды будет выведено новое приглашение командной оболочки, а сама команда будет исполняться в фоновом режиме. В момент завершения исполнения команды в фоновом режиме вы получите соответствующее сообщение.
[paul@RHELv4u3 ~]$ sleep 20 & [1] 7925 [paul@RHELv4u3 ~]$ ...ожидание в течение 20 секунд... [paul@RHELv4u3 ~]$ [1]+ Done sleep 20
Технические подробности выполняющихся при использовании рассматриваемого оператора операций приведены в разделе, посвященном процессам
.
Символ доллара со знаком вопроса ($?)
$?
. На самом деле $?
является параметром командной оболочки, а не ее переменной, так как вы не можете присвоить значение переменной $?
.
paul@debian5:~/test$ touch file1 paul@debian5:~/test$ echo $? 0 paul@debian5:~/test$ rm file1 paul@debian5:~/test$ echo $? 0 paul@debian5:~/test$ rm file1 rm: невозможно удалить "file1": Нет такого файла или каталога paul@debian5:~/test$ echo $? 1 paul@debian5:~/test$
Двойной амперсанд (&&)
&&
как логический оператор "И"
. При использовании оператора &&
вторая команда будет исполняться только в том случае, если исполнение первой команды успешно завершится (будет возвращен нулевой код завершения).
paul@barry:~$ echo первая команда && echo вторая команда первая команда вторая команда paul@barry:~$ zecho первая команда && echo вторая команда -bash: zecho: команда не найдена...
логического оператора "И"
. Данный пример начинается с использования работоспособного варианта команды cd
с последующим исполнением команды ls
, после чего используется неработоспособный вариант команды cd
, после которого команда ls
не исполняется
.
[paul@RHELv4u3 ~]$ cd gen && ls file1 file3 File55 fileab FileAB fileabc file2 File4 FileA Fileab fileab2 [paul@RHELv4u3 gen]$ cd gen && ls -bash: cd: gen: Нет такого файла или каталога
Двойная вертикальная черта (||)
||
представляет логическую операцию "ИЛИ"
. Вторая команда исполняется только тогда, когда исполнение первой команды заканчивается неудачей (возвращается ненулевой код завершения).
paul@barry:~$ echo первая команда || echo вторая команда ; echo третья команда первая команда третья команда paul@barry:~$ zecho первая команда || echo вторая команда ; echo третья команда -bash: zecho: команда не найдена... вторая команда третья команда paul@barry:~$
логического оператора "ИЛИ"
.
[paul@RHELv4u3 ~]$ cd gen || ls [paul@RHELv4u3 gen]$ cd gen || ls -bash: cd: gen: Нет такого файла или каталога file1 file3 File55 fileab FileAB fileabc file2 File4 FileA Fileab fileab2
Комбинирование операторов && и ||
структур условных переходов
в рамках строк команд. В данном примере используется команда echo
для вывода информации о том, успешно ли отработала команда rm
.
paul@laika:~/test$ rm file1 && echo Команда сработала! || echo Исполнение команды завершилось неудачей! Команда сработала! paul@laika:~/test$ rm file1 && echo Команда сработала! || echo Исполнение команды завершилось неудачей! rm: невозможно удалить "file1": Нет такого файла или каталога Исполнение команды завершилось неудачей! paul@laika:~/test$
Знак фунта (#)
символа фунта
(#) игнорируется командной оболочкой. Это обстоятельство оказывается полезным при возникновении необходимости в написании комментариев
в сценариях командной оболочки, причем комментарии ни коим образом не будут влиять на процесс исполнения команд или процесс раскрытия команд командной оболочкой.
paul@debian4:~$ mkdir test # создаем директорию paul@debian4:~$ cd test #### переходим в эту директорию paul@debian4:~/test$ ls # пуста ли она ? paul@debian4:~/test$
Экранирование специальных символов (\)
экранированием символов
.
[paul@RHELv4u3 ~]$ echo hello \; world hello ; world [paul@RHELv4u3 ~]$ echo hello\ \ \ world hello world [paul@RHELv4u3 ~]$ echo экранирование \\\ \#\ \&\ \"\ \' экранирование \ # & " ' [paul@RHELv4u3 ~]$ echo экранирование \\\?\*\"\' экранирование \?*"'
Обратный слэш в конце строки
[paul@RHEL4b ~]$ echo Данная строка команды \ > разделена на три \ > части Данная строка команды разделена на три части [paul@RHEL4b ~]$
Практическое задание: операторы управления
-
0. Ответ на каждый из вопросов может быть представлен с помощью единственной строки команды!
-
1. Какой бинарный файл исполняется при вводе команды
passwd
? -
2. Какого типа данный файл?
-
3. Выполните команду
pwd
два раза. (Помните о пункте 0.) -
4. Выполните команду
ls
после командыcd /etc
, но только в том случае, если исполнение командыcd /etc
завершилось без ошибок. -
5. Выполните команду
cd /etc
после командыcd etc
, но только в том случае, если исполнение командыcd etc
завершилось ошибкой. -
6. Выведите строку
"сработало"
в случае успешного завершения исполнения командыtouch test42
или строку"не сработало"
в случае неудачного завершения. Все операторы должны находиться в одной строке и исполняться с привилегиями обычного пользователя (не пользователя root). Протестируйте полученную команду в вашей домашней директории и директории/bin/
. -
7. Выполните команду
sleep 6
; для чего предназначена эта команда? -
8. Выполните команду
sleep 200
в фоновом режиме (без ожидая завершения ее исполнения). -
9. Создайте строку команды, в рамках которой будет исполняться команда
rm file55
. Ваша строка команды должна выводить строку 'удалось' в том случае, если файл file55 был удален и строку 'не удалось' в случае возникновения проблем. -
10 (необязательное задание). Используйте команду echo для вывода строки "Hello World со странными' символами \ * [ } ~ \\ ." (включая все кавычки).
Корректная процедура выполнения практического задания: операторы управления
-
0. Ответ на каждый из вопросов может быть представлен с помощью единственной строки команды!
-
1. Какой бинарный файл исполняется при вводе команды
passwd
? -
which passwd
-
2. Какого типа данный файл?
-
file /usr/bin/passwd
-
3. Выполните команду
pwd
два раза. (Помните о пункте 0.) -
pwd ; pwd
-
4. Выполните команду
ls
после командыcd /etc
, но только в том случае, если исполнение командыcd /etc
завершилось без ошибок. -
cd /etc && ls
-
5. Выполните команду
cd /etc
после командыcd etc
, но только в том случае, если исполнение командыcd etc
завершилось ошибкой. -
cd etc || cd /etc
-
6. Выведите строку
"сработало"
в случае успешного завершения исполнения командыtouch test42
или строку"не сработало"
в случае неудачного завершения. Все операторы должны находиться в одной строке и исполняться с привилегиями обычного пользователя (не пользователя root). Протестируйте полученную команду в вашей домашней директории и директории/bin/
. -
paul@deb503:~$ cd ; touch test42 && echo сработало || echo не сработало сработало paul@deb503:~$ cd /bin; touch test42 && echo сработало || echo не сработало touch: невозможно выполнить touch для "test42": Отказано в доступе не сработало
-
7. Выполните команду
sleep 6
; для чего предназначена эта команда? -
Осуществляется ожидание в течение 6 секунд
-
8. Выполните команду
sleep 200
в фоновом режиме (без ожидая завершения ее исполнения). -
sleep 200 &
-
9. Создайте строку команды, в рамках которой будет исполняться команда
rm file55
. Ваша строка команды должна выводить строку 'удалось' в том случае, если файл file55 был удален и строку 'не удалось' в случае возникновения проблем. -
rm file55 && echo удалось || echo не удалось
-
10 (необязательное задание). Используйте команду echo для вывода строки "Hello World со странными' символами \ * [ } ~ \\ ." (включая все кавычки).
-
echo \"Hello World со странными\' символами \\ \* \[ \} \~ \\\\ \. \" или echo \""Hello World со странными' символами \ * [ } ~ \\ . "\"
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 10. Команды и аргументы | Глава 12. Переменные командной оболочки |