- •II. First steps on the command line
- •5. Man pages
- •6. Working with directories (работа с папками)
- •7.Working with files
- •8. Working with file contents
- •9. The Linux file tree
- •III. Shell expansion
- •10. Commands and arguments
- •11. Control operators
- •12. Variables
- •13. Shell history
- •14. File globbing
- •IV. Pipes and commands
- •Глава 16. Фильтры.
- •16.3 Grep
- •16.7. Sort
- •16.8. Uniq
- •16.9. Comm
- •16.12. Примеры пайпов
- •Глава 17. Основные инструменты Unix
- •17.1. Find
- •17.2. Размещение
- •17.3. Date
- •17.5. Sleep
- •17.6. Time
- •17.7. Gzip - gunzip
- •17.8. Zcat - zmore
- •18.3. Замена и удаление символов (r X X)
- •18.4. Отменить и повторить (u .)
- •18.5. Вырезать, копировать и вставить строчки (dd yy p p)
- •18.6. Вырезать, копировать и вставить строчки (3dd 2yy)
- •18.8. Объединения двух и более линий (j)
- •18.9. Слова (w b)
- •18.10. Сохранить (или нет) и выход (:w :q :q! )
- •18.11. Поиск (/ ?)
- •18.13. Чтение файлов (:r :r !cmd)
- •19.1. Предпосылки
- •19.2. Hello World
- •19.4. Комментарии
- •20.2. Если, затем, иначе (if then else)
- •20.3. If then elif
- •20.4. For loop
- •20.5. While loop
- •21.2. Shift through parameters.
- •21.3. Runtime input.
- •21.3. Sourcing a config file.
- •21.5. Get script options with getopts.
- •21.6. Get shell options with shopt.
- •Глава 22 More scripting.
- •22.1. Eval.
- •22.4. Case.
- •22.5. Shell functions.
- •Раздел VII. Local user management. Глава 23. Users.
- •23.1. Identify yourself.
- •23.2. Users.
- •23.3. Passwords.
- •23.4 Home directories
- •23.5 User shell
- •23.6. Switcj users with su
- •23.7 Run a program as another user
- •23.10 Shell environment
- •Глава 24. Groups
- •24.1 About groups
- •24.2 Groupadd
- •24.3 /Etc/group
- •24.4 Usermod
- •24.5 Groupmod
- •24.6 Groupdel
- •24.7 Groups
- •24.8 Gpasswd
- •24.9 Vigr
11. Control operators
Тут будем рассматривать, как обрабатывать больше одной команды в командной строке за один раз.
точка с запятой
Вы можете поместить в одну строку 2 или больше команд разделенных точкой с запятой ; . Все аргументы до неё будут отделены и отнесены к первой команде. Обе команды будут выполнены последовательно. Shell будет ожидать окончания выполнения команды до начала следующей.
[paul@RHELv4u3 ~]$ echo Hello
Hello
[paul@RHELv4u3 ~]$ echo World
World
[paul@RHELv4u3 ~]$ echo Hello ; echo World
Hello
World
[paul@RHELv4u3 ~]$
& - амперсанд
Когда строка оканчивается знаком амперсанда, то shell не будет ожидать завершение выполнения команды. Вы получите возможность сразу вводить новые команды, а предыдущая команда будет выполняться в фоновом режиме. По завершении выполнения вы получите сообщение.
[paul@RHELv4u3 ~]$ sleep 20 &
[1] 7925
[paul@RHELv4u3 ~]$
...wait 20 seconds...
[paul@RHELv4u3 ~]$
[1]+ Done sleep 20
Техническое объяснение происходящего в этом случае будет объяснено в главе о процессах.
$? 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.
&& - двойной амперсанд. 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
|| двойная вертикальная черта
Представляет собой логическое ИЛИ. Вторая команда выполняется только в случае, если первая команда не выполняется (возвращает ненулевой статус выхода).
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
Комбинации && и ||
Можно использовать эти логические И и ИЛИ чтобы писать структуры 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$
# - решетка/диез/знак фунта
Все что написано после этого символа игнорируется 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$
\ избежание специальных символов
Символ обратного слеша \ отменяет использование управляющих символов (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 ~]$