Введение
В этом сеансе мы рассмотрели различные управляющие операторы, такие как точка с запятой (;), амперсанд (&), знак вопроса в долларах ($?), двойной амперсанд (&&), двойной вертикальная черта (||), сочетание (&&) и (||), знак решетки (#), экранирование специальных символов (), обратная косая черта в конце строки и т. д. Мы также кратко обсудим связанные параметры ($?) и аналогичные специальные символы (&).
точка с запятой (;)
Вы можете поместить две или более команд в одну строку, разделенные точкой с запятой (;). Оболочка будет сканировать строку до точки с запятой. Все аргументы перед точкой с запятой будут считаться командой, отдельной от всех аргументов после точки с запятой. Обе серии будут выполняться последовательно, при этом оболочка ожидает завершения каждой команды перед запуском следующей.
[email protected]: ~ $ echo RamRam [email protected]: ~ $ echo ShyamShyam [адрес электронной почты защищен]: ~ $ echo Ram; echo ShyamRamShyam [адрес электронной почты защищен]: ~ $
амперсанд (&)
Когда строка заканчивается амперсанд &, оболочка не будет ждать завершения команды. Вы получите обратно приглашение оболочки, и команда будет выполняться в фоновом режиме. Вы получите сообщение, когда эта команда завершит выполнение в фоновом режиме.
[email protected]: ~ $ sleep 20 & [1] 3124 [email protected]: ~ $ [1] + Done sleep 20
Техническое объяснение того, что происходит в этом случае, объясняется в главе о процессах.
знак вопроса в виде доллара ($?)
Код выхода предыдущей команды сохраняется в переменной оболочки $ ?. Собственно $? является параметром оболочки, а не переменной, поскольку вы не можете присвоить значение $ ?.
[email protected]: ~ $ touch file1 [email protected]: ~ $ echo $? 0 [защита электронной почты]: ~ $ rm file1 [защита электронной почты]: ~ $ echo $? 0 [защита электронной почты]: ~ $ rm file1rm: невозможно удалить? File1 ?: Нет такого файла или каталога [защита электронной почты]: ~ $ echo $? 1 [электронная почта защищена]: ~ $
двойной амперсанд (&&)
Оболочка интерпретирует && как логическое И. При использовании && вторая команда выполняется только в случае успеха первой (возвращает нулевой статус выхода).
[email protected]: ~ $ echo Ram && echo ShyamRamShyam [email protected]: ~ $ zecho Ram && echo Shyam Не найдена команда 'zecho', вы имели в виду: Команда 'aecho' из пакета 'netatalk' (вселенная) Команда 'echo' из пакета 'coreutils' (основной) zecho: command not found
Следующий пример (принцип логического И) начинается с рабочего компакт-диска, за которым следует ls, затем нерабочий компакт-диск, за которым не следует ls.
[защита электронной почты]: ~ $ cd gen && lsbash: cd: gen: Нет такого файла или каталога [защита электронной почты]: ~ $ cd gen && lsbash: cd: gen : Нет такого файла или каталога
двойная вертикальная черта (||)
|| представляет собой логическое ИЛИ. Вторая команда выполняется только в случае сбоя первой команды (возвращает ненулевой статус выхода).
[email protected]: ~ $ echo Ram || эхо Шьям; echo MadhuRamMadhu [адрес электронной почты защищен]: ~ $ zecho Ram || эхо Шьям; echo MadhuНет команды 'zecho', вы имели в виду: Команда 'echo' из пакета 'coreutils' (основной) Команда 'aecho' из пакета 'netatalk' (вселенная) zecho: команда не найденаShyamMadhu [электронная почта защищена]: ~ $
Вот еще один пример того же принципа логического ИЛИ.
[электронная почта защищена]: ~ $ cd gen || lsbash: cd: gen: Нет такого файла или каталога ABC.png MyTestajax-php-mysql-user-interface.html part1count part2Desktop part3Documents PicturesDownloads pngexamples.desktop Publicfile2 sqlite3FileA sqlite-amalgamation-3080500 command-past-date.png sqlite-shell-linux-x86-3080500.zipmno.txt summer.pngMusic Summer.pngMyDir TemplatesMyDir1 test1MyDirA text2Myfile1.doc typescriptMYFILE1.doc VideosMYFILE2.doc xyz.txt [email protected] >
объединение (&&) и (||)
Вы можете использовать это логическое И и логическое ИЛИ, чтобы написать if -then-else в командной строке. В этом примере используется echo для отображения успешности выполнения команды rm.
[email protected]: ~ $ rm file1 && echo Это сработало! || echo Не удалось! rm: невозможно удалить? file1 ?: Нет такого файла или каталога Не удалось! [электронная почта защищена]: ~ $ rm file1 && echo Это сработало! || echo Не удалось! rm: невозможно удалить? file1 ?: Нет такого файла или каталога Не удалось! [электронная почта защищена]: ~ $
знак решетки (#)
Все, что написано после знака решетки (#), игнорируется оболочкой. Это полезно для написания комментария оболочки, но не влияет на выполнение команды или расширение оболочки.
[email protected]: ~ $ mkdir test2 # мы создаем каталог [ email protected]: ~ $ cd test2 #### мы входим в каталог [email protected]: ~/test2 $ ls # он пуст? [email protected]: ~/test2 $
экранирование специальных символов ()
Символ обратной косой черты позволяет использовать управляющие символы, но без интерпретации оболочки это называется экранированием символов..
[электронная почта защищена]: ~/test2 $ echo Ram ; ShyamRam; Shyam [защита электронной почты]: ~/test2 $ echo Ram ShyamRam Shyam [защита электронной почты]: ~/test2 $ echo escaping \ # " 'escaping #"' [защита электронной почты]: ~ /test2 $ echo escaping \? * " 'escaping ? *"' [email protected]: ~/test2 $
конец обратная косая черта в строке
Строки, заканчивающиеся обратной косой чертой, продолжаются на следующей строке. Оболочка не интерпретирует символ новой строки и будет ожидать расширения оболочки и выполнения командной строки до тех пор, пока не встретится новая строка без обратной косой черты.
[email protected]: ~/test2 $ echo Ram is > good > boyRam is good boy [email protected]: ~/test2 $
еще один пример обратной косой черты в конце строки
[электронная почта защищена]: ~/test2 $ echo Конец > строки > обратная косая черта Конец строки обратная косая черта [защита электронной почты]: ~/test2 $
Упражнение и решение:
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 и т. д., но только в случае сбоя cd и т. д.
Код:
cd и т. д. || cd/etc
6. Выполнить sleep 7, что делает эта команда?
с паузой на семь секунд
7. Выполнить 500 сна в фоновом режиме.
sleep 500 &
8. Напишите командную строку, которая выполняет команду rm abcd. В командной строке должно быть напечатано «успешно», если abcd удален, и «сбой», если возникла проблема.
Код:
rm abcd && echo success || эхо не удалось