Bash: различия между версиями
Перейти к навигации
Перейти к поиску
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
Строка 149: | Строка 149: | ||
= Обработка ошибок = | = Обработка ошибок = | ||
+ | # прерывание скрипта при любой ошибке | ||
<pre> | <pre> | ||
set -e | set -e | ||
# некоторый критический блок кода, где ошибка недопустима | # некоторый критический блок кода, где ошибка недопустима | ||
# выполнение скрипта прервется, если какая-либо команда вернет не 0 | # выполнение скрипта прервется, если какая-либо команда вернет не 0 | ||
+ | # если используются конструкции вызывающие дочерний bash процесс, например код заключенный в скобки (), то не ноль должен вернуть блок кода в целом | ||
+ | # также это не будет работать для промежуточных команд в серии пайпов | ||
+ | true | false | true | ||
+ | echo "Это будет напечатано" | ||
set +e | set +e | ||
+ | |||
+ | set -o pipefail -e | ||
+ | # код будет прерван, даже если ошибка возникла внутри серии пайпов | ||
+ | true | false | true | ||
+ | echo "Это не будет напечатано" | ||
+ | set +e | ||
+ | |||
</pre> | </pre> |
Версия 15:09, 10 января 2025
Обзор
bash - это наиболее популярный но не единственный командный интерпретатор в среде Linux.
Исполняемый файл обычно расположен здесь /bin/bash
.
Код скрипта должен начинаться строкой
#!/bin/bash
Варианты запуска скрипта
# текущий командный интерпретатор запустит интерпретатор bash как дочерний процесс, который выполнит скрипт /bin/bash /home/myuser/myscript.sh # текущий интерпретатор выполнит скрипт в рамках своего процесса, # если в строке #! не задан другой тип интерпретатора . /home/myuser/myscript.sh
Условия
if <command> then <command> else <command> fi # пример, если ошибка, то # ! - команда отрицания # [ - команда проверки условия (пробелы важны) if ! [ $? -eq 0 ] then echo ERROR fi
Циклы
for
По списку
for <var> in <list> do команды done <list> := если путь к каталогу, то перечисляется содержимое каталога <list> := если текст, то перечисляются фрагменты текста, разделитель определяется переменной $IFS. По умолчанию, IFS=' '. # пример перечисления строк файла IFS=$'\n' for a in $(cat /etc/password) do echo $a done # пример перечисления массива myArr[0]='item1' myArr[1]='item2' myArr[2]='item3' for i in "${!myArr[@]}" do echo ${myArr[$i]} done
В стиле С
for (( i=0; i<10; i++ )) do команды done
команды управления циклом
# прервать текущую итерацию и перейти к следующей continue # прервать цикл break
Cкобки (brackets)
Ссылки по теме:
( ... ) - блок команд, выполняется в рамках отдельного дочернего процесса
a=2 ( a=3 echo $a ) echo $a #вывод будет таким 3 2
{ ... } - блок команд, выполняются в рамках текущего процесса
a=2 { a=3 echo $a } echo $a #вывод будет таким 3 3
<( ... ) - блок команд, вывод которых передается в динамически создаваемую область памяти, при этом сам блок возвращает путь к этой области в виде /dev/fd/63
. Также необходимо учитывать, что данные области памяти удаляются сразу после выполнения первого дочернего процесса запущенного скриптом.
echo <(echo test1; echo test2) <(echo test3) #вывод /dev/fd/63 /dev/fd/62 cat <(echo test1; echo test2) <(echo test3) #вывод test1 test2 test3
Ввод пароля
echo password: read -s pass mysql -u root -p $pass
Обработка ошибок
- прерывание скрипта при любой ошибке
set -e # некоторый критический блок кода, где ошибка недопустима # выполнение скрипта прервется, если какая-либо команда вернет не 0 # если используются конструкции вызывающие дочерний bash процесс, например код заключенный в скобки (), то не ноль должен вернуть блок кода в целом # также это не будет работать для промежуточных команд в серии пайпов true | false | true echo "Это будет напечатано" set +e set -o pipefail -e # код будет прерван, даже если ошибка возникла внутри серии пайпов true | false | true echo "Это не будет напечатано" set +e