- Операторы объединения команд в Linux & | ; && ! || &&-|| \ ()
- 1. Оператор амперсанда (&)
- 2. Оператор точка с запятой (;)
- 3. Оператор AND (&&)
- 4. Оператор OR (||)
- 5. Оператор NOT (!)
- 6. Оператор AND-OR (&& — ||)
- 7. Оператор потока PIPE (|)
- 8. Оператор комбинации команд <>
- 9. Оператор приоритета ()
- 10. Оператор конкатенации (\)
- Linux — Control-операторы
Операторы объединения команд в Linux & | ; && ! || &&-|| \ ()
Цепочка команд Linux означает объединение нескольких команд и выполнение их на основе оператора, используемого между ними. Цепочка команд в Linux — это то, когда вы пишете короткие скрипты оболочки в самой оболочке и выполняете их непосредственно из терминала. Цепочка позволяет автоматизировать процесс. Более того, необслуживаемая машина может функционировать более систематически с помощью операторов цепочки.
Эта статья направлена на то, чтобы пролить свет на часто используемые операторы цепочек команд, с краткими описаниями и соответствующими примерами, которые, несомненно, повысят вашу производительность и позволят вам писать короткие и содержательные коды, помимо сокращения нагрузки на систему, в разы.
1. Оператор амперсанда (&)
Функция ‘&‘ — заставит команду работать в фоновом режиме. Просто введите команду с пробелом и ‘&‘. Вы можете выполнить более одной команды в фоновом режиме за один раз.
Запустите одну команду в фоновом режиме:
Запустите две команды в фоновом режиме одновременно:
# sudo apt update & sudo apt upgrade &
2. Оператор точка с запятой (;)
Оператор точка с запятой позволяет запускать несколько команд за один раз, и выполнение команды происходит последовательно.
# sudo apt update ; sudo apt upgrade ; mkdir test
Приведенная выше комбинация команд сначала выполнит обновление репозитория, затем обновит систему и, наконец, создаст каталог «test» в текущей рабочей директории.
3. Оператор AND (&&)
Оператор AND (&&) будет выполнять вторую команду только в том случае, если при выполнении первой команды SUCCEEDS, т.е. состояние выхода первой команды равно «0» — программа выполнена успешно. Эта команда очень полезна при проверке состояния выполнения последней команды.
Например, я хочу посетить сайт sedicomm.com с помощью команды links в терминале, но перед этим мне нужно проверить, является ли хост доступным или нет.
# ping -c3 www.sedicomm.com && links www.sedicomm.com
4. Оператор OR (||)
Оператор OR (||) очень похож на оператор «else» в программировании. Вышеуказанный оператор позволяет вам выполнять вторую команду только в случае сбоя при выполнении первой команды, то есть состояние выхода первой команды равно «1» — программа выполнена НЕ успешно».
Например, я хочу выполнить «apt-get update» из учетной записи без полномочий root, и если первая команда не будет выполнена, тогда будет выполнена вторая команда «links www.sedicomm.com».
# sudo apt update || links sedicomm.com
В приведенной выше команде, поскольку пользователю не было разрешено обновить систему, это означает, что состояние выхода первой команды равно «1» и, следовательно, выполняется последняя команда «links sedicomm.com».
Что, если первая команда выполнена успешно, со статусом выхода «0«? Очевидно! Вторая команда не будет выполнена.
# mkdir test || links sedicomm.com
Здесь пользователь создает папку «test» в своем домашнем каталоге, где ему это разрешено. Команда выполнена успешно, что дает статус выхода «0«, и, следовательно, последняя часть команды не выполняется.
5. Оператор NOT (!)
Оператор NOT (!) очень похож на оператор «кроме«. Эта команда выполнит все, кроме предоставленного условия. Чтобы понять как это работает, создайте каталог «sedicomm» в вашем домашнем каталоге и перейдите к нему с помощью команды «cd«.
# mkdir sedicomm cd sedicomm
Затем создайте несколько типов файлов в папке «sedicomm».
# touch a.doc b.doc a.pdf b.pdf a.xml b.xml a.html b.html
Смотрите, мы создали все новые файлы в папке «sedicomm».
# ls a.doc a.html a.pdf a.xml a.doc b.html b.pdf b.xml
Теперь удалите все файлы, за исключением файла «html»одновременно, умным способом.
Просто чтобы проверить, последнее исполнение. Перечислите все доступные файлы с помощью команды ls.
6. Оператор AND-OR (&& — ||)
Вышеуказанный оператор фактически является комбинацией оператора «AND» и «OR». Это очень похоже на утверждение «если-еще».
Например, давайте сделаем ping на obu4alka.ru, если успешно то выведем на экран ‘Verified‘, если ping не успешный, то выведен на экран ‘Host Down‘.
# ping -c3 www.obu4alka.ru && echo"Verified" || echo"Host Down"
Пример вывода
--- www.obu4alka.ru ping statistics --- 3 packets transmitted, 2 received, 33% packet loss, time 2031ms rtt min/avg/max/mdev = 15.904/15.951/15.998/0.047 ms Verified
Теперь отключите интернет-соединение и повторите ту же команду.
# ping -c3 www.obu4alka.ru && echo "Verified" || echo "Host Down"
Пример вывода
ping: unknown host www.obu4alka.ru Host Down
7. Оператор потока PIPE (|)
Этот оператор потока PIPE очень полезен, когда выходные данные первой команды действуют как входные данные для второй команды. Например, направьте вывод команды «ls -l» на «less» и посмотрите вывод всего скрипта.
8. Оператор комбинации команд <>
Объедините две или более команд, вторая команда зависит от выполнения первой команды.
Например, проверьте, доступен ли каталог «bin», и выведите соответствующий вывод.
[ -d"bin" ] || < echo Directory does not exist, creating directory now.; mkdir bin; >&& echo Directory exists.
9. Оператор приоритета ()
Оператор позволяет выполнить команду в порядке приоритета.
# Command_x1 && Command_x2 || Command_x3 && Command_x4
В приведенной выше псевдокоманде, что если Command_x1 завершится неудачно? Ни один из Command_x2, Command_x3, Command_x4 не будет выполнен, для этого мы используем оператор приоритета вот так:
# (Command_x1 &&Command_x2) || (Command_x3 && Command_x4)
В вышеприведенном скрипте, если Command_x1 завершается ошибкой, Command_x2 также завершается ошибкой, но все же выполнение Command_x3 и Command_x4 зависит от состояния выхода Command_x3.
10. Оператор конкатенации (\)
Оператор конкатенации (\), как указывает имя, используется для объединения больших команд в нескольких строках оболочки. Например, команда ниже откроет текстовый файл test(1) .txt.
Linux — Control-операторы
На этом занятии мы рассмотрели различные управляющие операторы, такие как точка с запятой (;), амперсанд (&), знак доллара ($?), Двойной амперсанд (&&), двойная вертикальная черта (||), объединение (&&) и (|| ), знак решетки (#), экранирование специальных символов (), обратный слеш в конце строки и т. д. Мы также кратко обсудим связанные параметры ($?) и аналогичные специальные символы (&).
точка с запятой(;)
Вы можете поместить две или более команд в одну строку, разделенные точкой с запятой (;). Оболочка будет сканировать строку, пока не достигнет точки с запятой. Все аргументы перед этой точкой с запятой будут рассматриваться как отдельная команда из всех аргументов после точки с запятой. Обе серии будут выполняться последовательно с оболочкой, ожидающей завершения каждой команды перед началом следующей.
[email protected]:~$ echo Ram Ram [email protected]:~$ echo Shyam Shyam [email protected]:~$ echo Ram ; echo Shyam Ram Shyam [email protected]:~$
Когда строка заканчивается амперсандом &, оболочка не будет ждать завершения команды. Вы вернете приглашение оболочки, и команда будет выполнена в фоновом режиме. По окончании выполнения этой команды в фоновом режиме вы получите сообщение.
[email protected]:~$ sleep 20 & [1] 3124 [email protected]:~$ [1]+ Done sleep 20
Техническое объяснение того, что происходит, в данном случае объясняется в главе о процессах.
знак вопроса доллара ($?)
Код выхода предыдущей команды хранится в переменной оболочки $ ?. На самом деле $? является параметром оболочки, а не переменной, так как вы не можете присвоить значение $ ?.
[email protected]:~$ touch file1 [email protected]:~$ echo $? 0 [email protected]:~$ rm file1 [email protected]:~$ echo $? 0 [email protected]:~$ rm file1 rm: cannot remove ?file1?: No such file or directory [email protected]:~$ echo $? 1 [email protected]:~$
двойной амперсанд (&&)
Оболочка будет интерпретировать && как логическое И. При использовании && вторая команда выполняется, только если первая успешна (возвращает нулевое состояние выхода).
[email protected]:~$ echo Ram && echo Shyam Ram Shyam [email protected]:~$ zecho Ram && echo Shyam No command 'zecho' found, did you mean: Command 'aecho' from package 'netatalk' (universe) Command 'echo' from package 'coreutils' (main) zecho: command not found
Следующий пример (принцип логического И) начинается с рабочего компакт-диска, за которым следует ls, затем за нерабочий компакт-диск, за которым не следует ls.
[email protected]:~$ cd gen && ls bash: cd: gen: No such file or directory [email protected]:~$ cd gen && ls bash: cd: gen: No such file or directory
двойная вертикальная черта (||)
|| представляет логическое ИЛИ. Вторая команда выполняется только в случае сбоя первой команды (возвращает ненулевой статус выхода).
[email protected]:~$ echo Ram || echo Shyam ; echo Madhu Ram Madhu [email protected]:~$ zecho Ram || echo Shyam; echo Madhu No command 'zecho' found, did you mean: Command 'echo' from package 'coreutils' (main) Command 'aecho' from package 'netatalk' (universe) zecho: command not found Shyam Madhu [email protected]:~$
Вот еще один пример того же принципа логического ИЛИ.
[email protected]:~$ cd gen || ls bash: cd: gen: No such file or directory ABC.png MyTest ajax-php-mysql-user-interface.html part1 count part2 Desktop part3 Documents Pictures Downloads png examples.desktop Public file2 sqlite3 FileA sqlite-amalgamation-3080500 (2) FileB sqlite-amalgamation-3080500.zip linux-command-past-date.png sqlite-shell-linux-x86-3080500.zip mno.txt summer.png Music Summer.png MyDir Templates MyDir1 test1 MyDirA text2 Myfile1.doc typescript MYFILE1.doc Videos MYFILE2.doc xyz.txt [email protected]:~$
объединение (&&) и (||)
Вы можете использовать это логическое И и логическое ИЛИ для записи структуры if-then-else в командной строке. Этот пример использует echo, чтобы показать, была ли команда rm успешной.
[email protected]:~$ rm file1 && echo It worked! || echo It failed! rm: cannot remove ?file1?: No such file or directory It failed! [email protected]:~$ rm file1 && echo It worked! || echo It failed! rm: cannot remove ?file1?: No such file or directory It failed! [email protected]:~$
знак фунта стерлингов (#)
Все, что написано после знака фунта (#), игнорируется оболочкой. Это полезно для написания комментария к оболочке, но не влияет на выполнение команды или расширение оболочки.
[email protected]:~$ mkdir test2 # we create a directory [email protected]:~$ cd test2 #### we enter the directory [email protected]:~/test2$ ls # is it empty? [email protected]:~/test2$
экранирование специальных символов ()
Символ обратной косой черты позволяет использовать управляющие символы, но без интерпретации оболочки это называется экранирующими символами.
[email protected]:~/test2$ echo Ram \; Shyam Ram ; Shyam [email protected]:~/test2$ echo Ram\ \ \ Shyam Ram Shyam [email protected]:~/test2$ echo escaping \\\ \#\ \"\ \' escaping \ # " ' [email protected]:~/test2$ echo escaping \\\?\*\"\' escaping \?*"' [email protected]:~/test2$
обратный слеш в конце строки
Строки, заканчивающиеся обратным слешем, продолжаются на следующей строке. Оболочка не интерпретирует символ новой строки и будет ожидать расширения оболочки и выполнения командной строки, пока не встретится новая строка без обратной косой черты.
[email protected]:~/test2$ echo Ram is \ > good \ > boy Ram is good boy [email protected]:~/test2$
еще один пример обратной косой черты конца строки
[email protected]:~/test2$ echo End of\ > line \ > backslash End ofline backslash [email protected]:~/test2$
Упражнение и решение:
1. Когда вы вводите passwd, какой файл выполняется?
2. Что это за файл?
3. Выполните команду pwd дважды. (помните 0.)
4. Выполните ls после cd / etc, но только если cd / etc не выдал ошибку.
5. Выполните cd / etc после cd и т. Д., Но только в случае сбоя cd и т. Д.
6. Выполните сон 7, что делает эта команда?
7. Выполните сон 500 в фоновом режиме.
8. Напишите командную строку, которая выполняет rm abcd. Ваша командная строка должна вывести «success», если abcd удален, и «fail», если возникла проблема.
rm abcd && echo success || echo failed