Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

11. Control operators

Тут будем рассматривать, как обрабатывать больше одной команды в командной строке за один раз.

  1. точка с запятой

Вы можете поместить в одну строку 2 или больше команд разделенных точкой с запятой ; . Все аргументы до неё будут отделены и отнесены к первой команде. Обе команды будут выполнены последовательно. Shell будет ожидать окончания выполнения команды до начала следующей.

[paul@RHELv4u3 ~]$ echo Hello

Hello

[paul@RHELv4u3 ~]$ echo World

World

[paul@RHELv4u3 ~]$ echo Hello ; echo World

Hello

World

[paul@RHELv4u3 ~]$

  1. & - амперсанд

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

[paul@RHELv4u3 ~]$ sleep 20 &

[1] 7925

[paul@RHELv4u3 ~]$

...wait 20 seconds...

[paul@RHELv4u3 ~]$

[1]+ Done sleep 20

Техническое объяснение происходящего в этом случае будет объяснено в главе о процессах.

  1. $? dollar question mark

Код выхода предыдущей команды хранится в shell переменной $?. Вообще то $? является параметром shell, а не переменной, так как вы не можете присвоить значение для $?.

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: cannot remove `file1': No such file or directory

paul@debian5:~/test$ echo $?

1

paul@debian5:~/test$

Как видно, если команда выполнена, код – 0, если не выполнена – 1.

  1. && - двойной амперсанд. Shell интерпретирует && как логическое И. При использовании && вторая команда будет выполнена только в случае, если будет выполнена первая команда (вернет нулевой статус выхода).

paul@barry:~$ echo first && echo second

first

second

paul@barry:~$ zecho first && echo second

-bash: zecho: command not found

Другой пример логического И, сначала команда 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: No such file or directory

  1. || двойная вертикальная черта

Представляет собой логическое ИЛИ. Вторая команда выполняется только в случае, если первая команда не выполняется (возвращает ненулевой статус выхода).

paul@barry:~$ echo first || echo second ; echo third

first

third

paul@barry:~$ zecho first || echo second ; echo third

-bash: zecho: command not found

second

third

paul@barry:~$

Другой пример того же принципа:

[paul@RHELv4u3 ~]$ cd gen || ls

[paul@RHELv4u3 gen]$ cd gen || ls

-bash: cd: gen: No such file or directory

file1 file3 File55 fileab FileAB fileabc

file2 File4 FileA Fileab fileab2

  1. Комбинации && и ||

Можно использовать эти логические И и ИЛИ чтобы писать структуры if-then-else в командной строке. В примере команда echo используется для определения, была ли команда rm выполнена успешно

paul@laika:~/test$ rm file1 && echo It worked! || echo It failed!

It worked!

paul@laika:~/test$ rm file1 && echo It worked! || echo It failed!

rm: cannot remove `file1': No such file or directory

It failed!

paul@laika:~/test$

  1. # - решетка/диез/знак фунта

Все что написано после этого символа игнорируется shell. Это полезно для написания комментариев, но не имеет никакого влияния на выполнение команды или расширение shell.

paul@debian4:~$ mkdir test # we create a directory

paul@debian4:~$ cd test #### we enter the directory

paul@debian4:~/test$ ls # is it empty ?

paul@debian4:~/test$

  1. \ избежание специальных символов

Символ обратного слеша \ отменяет использование управляющих символов (control characters), но shell так же не интерпретирует их:

[paul@RHELv4u3 ~]$ echo hello \; world

hello ; world

[paul@RHELv4u3 ~]$ echo hello\ \ \ world

hello world

[paul@RHELv4u3 ~]$ echo escaping \\\ \#\ \&\ \"\ \'

escaping \ # & " '

[paul@RHELv4u3 ~]$ echo escaping \\\?\*\"\'

escaping \?*"'

Строка, заканчивающаяся обратным слешем, будет продолжена на следующей строке. Shell никак не будет интерпретировать этот символ и будет ждать shell expansion и не будет выполнять команду до тех пор, пока не встретится новая строка без обратного слеша:

[paul@RHEL4b ~]$ echo This command line \

> is split in three \

> parts

This command line is split in three parts

[paul@RHEL4b ~]$

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]