- Условные операторы if..else командной оболочки Bash
- Bash if..else Statement
- В этом руководстве мы познакомим вас с основами if оператора Bash и покажем, как его использовать в сценариях оболочки
- if..else
- if..elif..else
- Вложенные if
- Несколько условий
- Тестовые операторы
- Вывод
- if if
- Синтаксис Syntax
- Параметры Parameters
- Комментарии Remarks
- Примеры Examples
- How can I split a shell command over multiple lines when using an IF statement?
- 2 Answers 2
Условные операторы if..else командной оболочки Bash
Bash if..else Statement
В этом руководстве мы познакомим вас с основами if оператора Bash и покажем, как его использовать в сценариях оболочки
Принятие решений — одна из самых фундаментальных концепций компьютерного программирования. Как и в любом другом языке программирования, if , if..else , if..elif..else и вложенные if в Bash могут быть использованы для выполнения кода на основе определенного состояния.
Условия Bash if могут иметь разные формы. Самое основное утверждение if принимает следующую форму:
Если TEST-COMMAND оценивается как True , STATEMENTS выполняется. Если TEST-COMMAND возвращается False , ничего не происходит, STATEMENTS игнорируется.
Как правило, рекомендуется всегда делать отступы для вашего кода и отделять блоки кода пустыми строками. Большинство людей предпочитают использовать отступы с 4 или 2 пробелами. Отступы и пустые строки делают ваш код более читабельным и упорядоченным.
Давайте посмотрим на следующий пример сценария, который проверяет, больше ли заданное число, чем 10:
Сохраните код в файле и запустите его из командной строки:
Скрипт предложит вам ввести номер. Например, если вы введете 15, test команда выполнит оценку, true потому что 15 больше 10, и echo команда внутри then условия будет выполнена.
if..else
Оператор Bash if..else принимает следующую форму:
Если TEST-COMMAND оценка до True , STATEMENTS1 будет выполнен. В противном случае, если TEST-COMMAND возвращается False , STATEMENTS2 будет выполнен. Вы можете иметь только одно else условие в объявлении.
Давайте добавим else условие в предыдущий пример сценария:
Если вы запустите код и введете число, сценарий напечатает другое сообщение в зависимости от того, больше это число или меньше / равно 10.
if..elif..else
Оператор Bash if..elif..else принимает следующую форму:
Вы можете иметь одно или несколько elif условий в объявлении. else Пункт не является обязательным.
Условия оцениваются последовательно. Как только условие возвращается, True остальные условия не выполняются, и управление программой переходит к концу if операторов.
Давайте добавим условие elif к предыдущему сценарию:
Вложенные if
Bash позволяет вам вкладывать if утверждения в if утверждения. Вы можете разместить несколько if операторов внутри другого if оператора.
Следующий скрипт предложит вам ввести три числа и напечатает наибольшее число среди трех чисел.
Вот как будет выглядеть вывод:
Как правило, более эффективно использовать case оператор вместо вложенных if операторов.
Несколько условий
Логические OR и AND операторы позволяют использовать несколько условий в if выражениях.
Вот еще одна версия скрипта для печати наибольшего числа среди трех чисел. В этой версии вместо вложенных if операторов мы используем оператор логического AND ( && ).
Тестовые операторы
В Bash команда test принимает одну из следующих синтаксических форм:
Чтобы сделать скрипт переносимым, предпочтите использовать старую [ команду test, которая доступна во всех оболочках POSIX. Новая обновленная версия test команды [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Чтобы отменить тестовое выражение, используйте логический оператор NOT ( ! ). При сравнении строк всегда используйте одинарные или двойные кавычки, чтобы избежать проблем с разбивкой слов.
Ниже приведены некоторые из наиболее часто используемых операторов:
- -n VAR — Истина, если длина VAR больше нуля.
- -z VAR — Правда, если VAR пусто.
- STRING1 = STRING2 — Правда, если STRING1 и STRING2 равны.
- STRING1 != STRING2 — Правда если STRING1 и STRING2 не равны.
- INTEGER1 -eq INTEGER2 — Правда, если INTEGER1 и INTEGER2 равны.
- INTEGER1 -gt INTEGER2 — Верно, если INTEGER1 больше чем INTEGER2 .
- INTEGER1 -lt INTEGER2 — Правда, если INTEGER1 меньше, чем INTEGER2 .
- INTEGER1 -ge INTEGER2 — Истинно, если INTEGER1 равно или больше, чем INTEGER2.
- INTEGER1 -le INTEGER2 — Верно, если INTEGER1 равно или меньше чем INTEGER2 .
- -h FILE — Истина, если FILE существует и является символической ссылкой.
- -r FILE — Истинно, если FILE существует и доступно для чтения.
- -w FILE — Истина, если FILE существует и доступна для записи.
- -x FILE — True, если FILE существует и является исполняемым.
- -d FILE — True, если FILE существует и является каталогом.
- -e FILE — Истинно, если FILE существует и является файлом, независимо от типа (узел, каталог, сокет и т. Д.).
- -f FILE — True, если FILE существует и является обычным файлом (не каталогом или устройством).
Вывод
Операторы if , if..else and if..elif..else позволяют контролировать поток выполнения скрипта Bash, оценивая заданные условия.
if if
Выполняет условную обработку в пакетных программах. Performs conditional processing in batch programs.
Синтаксис Syntax
Если расширения команд включены, используйте следующий синтаксис: If command extensions are enabled, use the following syntax:
Параметры Parameters
Параметр Parameter | Описание Description |
---|---|
not not | Указывает, что команда должна выполняться, только если условие имеет значение false. Specifies that the command should be carried out only if the condition is false. |
ERRORLEVEL errorlevel | Задает истинное условие, только если предыдущая программа, выполненная Cmd.exe, вернула код выхода, который больше или равен Number. Specifies a true condition only if the previous program run by Cmd.exe returned an exit code equal to or greater than number. |
Указывает команду, которая должна быть выполнена при выполнении предыдущего условия. Specifies the command that should be carried out if the preceding condition is met. | |
== | Задает истинное условие, только если строка1 и строка2 совпадают. Specifies a true condition only if string1 and string2 are the same. Эти значения могут быть строками литерала или пакетными переменными (например, %1 ). These values can be literal strings or batch variables (for example, %1 ). Литеральные строки не нужно заключать в кавычки. You do not need to enclose literal strings in quotation marks. |
существующие exist | Указывает истинное условие, если указанное имя файла существует. Specifies a true condition if the specified file name exists. |
Задает оператор сравнения из трех букв, включая: Specifies a three-letter comparison operator, including:
| |
/i /i | Принудительное сравнение строк не учитывает регистр. Forces string comparisons to ignore case. Параметр /i можно использовать в string1==string2 формате If. You can use /i on the string1==string2 form of if. Эти сравнения являются универсальными, в том случае, если и строка1 , и строка2 состоят из цифр, строки преобразуются в числа и выполняется числовое сравнение. These comparisons are generic, in that if both string1 and string2 are comprised of numeric digits only, the strings are converted to numbers and a numeric comparison is performed. |
кмдекстверсион cmdextversion | Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд Cmd.exe, равен или больше указанного числа. Specifies a true condition only if the internal version number associated with the command extensions feature of Cmd.exe is equal to or greater than the number specified. Первая версия — 1. The first version is 1. Он увеличивается на единицу при добавлении значительных улучшений в расширения команд. It increases by increments of one when significant enhancements are added to the command extensions. Кмдекстверсион Conditional не имеет значения true, если расширения команд отключены (по умолчанию расширения команд включены). The cmdextversion conditional is never true when command extensions are disabled (by default, command extensions are enabled). |
defined defined | Указывает истинное условие, если переменная определена. Specifies a true condition if variable is defined. |
Задает команду командной строки и все параметры, которые будут переданы команде в предложении else . Specifies a command-line command and any parameters to be passed to the command in an else clause. | |
/? /? | Отображение справки в командной строке. Displays help at the command prompt. |
Комментарии Remarks
Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else . If the condition specified in an if clause is true, the command that follows the condition is carried out. If the condition is false, the command in the if clause is ignored and the command executes any command that is specified in the else clause.
Когда программа останавливается, она возвращает код выхода. When a program stops, it returns an exit code. Чтобы использовать коды выхода в качестве условий, используйте параметр ERRORLEVEL . To use exit codes as conditions, use the errorlevel parameter.
При использовании определенного значения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине% и % кмдекстверсион%. If you use defined, the following three variables are added to the environment: %errorlevel%, %cmdcmdline%, and %cmdextversion%.
% ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL. %errorlevel%: Expands into a string representation of the current value of the ERRORLEVEL environment variable. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL. This variable assumes that there isn’t already an existing environment variable with the name ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL. If there is, you’ll get that ERRORLEVEL value instead.
% кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd.exe до любой обработки Cmd.exe. %cmdcmdline%: Expands into the original command line that was passed to Cmd.exe prior to any processing by Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ. This assumes that there isn’t already an existing environment variable with the name CMDCMDLINE. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ. If there is, you’ll get that CMDCMDLINE value instead.
% кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион. %cmdextversion%: Expands into the string representation of the current value of cmdextversion. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН. This assumes that there isn’t already an existing environment variable with the name CMDEXTVERSION. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН. If there is, you’ll get that CMDEXTVERSION value instead.
Предложение else необходимо использовать в той же строке, что и команда после оператора If. You must use the else clause on the same line as the command after the if.
Примеры Examples
Чтобы отобразить сообщение не удается найти файл данных если не удается найти файл Product. dat, введите: To display the message Cannot find data file if the file Product.dat cannot be found, type:
Чтобы отформатировать диск в диске а и вывести сообщение об ошибке при возникновении ошибки в процессе форматирования, введите в пакетный файл следующие строки: To format a disk in drive A and display an error message if an error occurs during the formatting process, type the following lines in a batch file:
Чтобы удалить файл Product. dat из текущего каталога или отобразить сообщение, если Product. dat не найден, введите в пакетном файле следующие строки: To delete the file Product.dat from the current directory or display a message if Product.dat is not found, type the following lines in a batch file:
Эти строки можно объединить в одну строку следующим образом: These lines can be combined into a single line as follows:
Чтобы вывести значение переменной среды ERRORLEVEL после выполнения пакетного файла, введите в пакетный файл следующие строки: To echo the value of the ERRORLEVEL environment variable after running a batch file, type the following lines in the batch file:
Чтобы вернуться к метке «хорошо», если значение переменной среды ERRORLEVEL меньше или равно 1, введите: To go to the okay label if the value of the ERRORLEVEL environment variable is less than or equal to 1, type:
How can I split a shell command over multiple lines when using an IF statement?
How can I split a command over multiple lines in the shell, when the command is part of an if statement?
This doesn’t work:
Instead of the whole command executing, I get:
More importantly, what is missing from my understanding of Bash that will help me understand this and similar issues in the future?
2 Answers 2
The line-continuation will fail if you have whitespace (spaces or tab characters[1]) after the backslash and before the newline. With no such whitespace, your example works fine for me:
Some detail promoted from the comments: the line-continuation backslash in the shell is not really a special case; it is simply an instance of the general rule that a backslash «quotes» the immediately-following character, preventing any special treatment it would normally be subject to. In this case, the next character is a newline, and the special treatment being prevented is terminating the command. Normally, a quoted character winds up included literally in the command; a backslashed newline is instead deleted entirely. But otherwise, the mechanism is the same. Most importantly, the backslash only quotes the immediately-following character; if that character is a space or tab, you just get a literal space or tab, and any subsequent newline remains unquoted.
[1] or carriage returns, for that matter, as Czechnology points out. Bash does not get along with Windows-formatted text files, not even in WSL. Or Cygwin, but at least their Bash port has added a set -o igncr option that you can set to make it carriage-return-tolerant.