Введение в сценарии оболочки Bash

Подробный обзор написания сценариев для оболочки Bash

Сценарии оболочки - это мощный способ автоматизации задач, которые вы регулярно выполняете на своем компьютере.

В этом руководстве я даю обширный обзор сценариев оболочки и буду базовым справочником для более глубоких и продвинутых руководств по созданию практических сценариев оболочки.

Посмотри мойвведение в Башпочтовый.

Bash предоставляет вам набор команд, которые вместе можно использовать для создания небольших программ, которые по соглашению мы называем скриптами.

Обратите внимание на разницу. Мы говорим не о программировании на Bash, а о написании сценариев на Bash, и мы не называем сценарии Bash «программами на Bash». Это потому, что вы обычно можете достичь определенного уровня сложности, прежде чем почувствуете, что ваши скрипты выходят из-под контроля.

Но сценарии Bash великолепны, потому что вам не нужно ничего, кроме Bash, для их запуска. Ни компилятора, ни интерпретатора, только ваша оболочка.

Есть много вещей, которые вы пропустите в таких языках программирования, как Perl, JavaScript или Python.

Переменные не имеют области видимости, они все глобальны, нет стандартной библиотеки, например, у вас нет модульной системы. Но преимущества довольно велики: вы можете очень легко вызвать любой инструмент CLI, как если бы вы были в оболочке, а подход Unix, предусматривающий наличие множества небольших служебных команд, действительно делает создание сценариев оболочки ярким. Выполнять сетевые запросы сwget, обработать текст с помощьюawk, и больше.

Создание сценариев оболочки - это один из инструментов, который вам лучше знать, по крайней мере, знать, как читать программу, когда вы ее видите, и какие полезности она может принести в вашу повседневную работу.

Это руководство познакомит вас с теорией и концепциями сценариев Bash. Я опубликую более подробные руководства по конкретным методам или способам решения конкретных проблем в будущем.

Основы

Скрипты хранятся в файлах. Вы можете указать любое имя и расширение для сценария оболочки, это не имеет значения. Важно то, что он должен начинаться с «shebang» в первой строке:

#!/bin/bash

и это должен быть исполняемый файл.

Файл устанавливается как исполняемый с помощьюchmod, служебная команда.

Вы можете использовать это так:

chmod u+x myscript

сделатьmyscriptисполняемый файл для вашего пользователя (я не собираюсь здесь заходить в кроличью нору разрешений, но я скоро расскажу о них).

Теперь вы можете выполнить скрипт, если вы находитесь в той же папке, вызвав его./myscript, или используя полный путь к нему.

Во время обучения я рекомендую вам - когда это возможно - использовать онлайн-игровую площадкукак этот, это упрощает тестирование.

Комментарии

Комментарии - одна из самых важных вещей при написании программ. Строка, начинающаяся с#символ - это комментарий (за исключением строки shebang, которую вы видели здесь выше).

#!/bin/bash
# this is a comment

Комментарий также может начинаться в конце строки:

#!/bin/bash
echo ok # this is a comment

Переменные

Вы можете установить переменные, используя=оператор:

name=value

Примеры:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

Вы можете распечатать переменную, используяechoвстроенная команда и добавление$к имени переменной:

echo $ROOM_NUMBER
echo $name

Операторы

Bash реализует некоторые арифметические операторы, обычно используемые в языках программирования:

  • +Добавить
  • -вычесть
  • *умножать
  • /разделять
  • %по модулю (остаток от деления)
  • **возведение в степень

Вы можете сравнить значения, используя

  • <
  • <=
  • ==
  • >=
  • >

Вы также можете использовать эти операторы сравнения:

  • -ltниже чем
  • -gtлучше чем
  • -leменьше или равно чем
  • -geбольше или равно чем
  • -eqравно
  • -neне равно

Таким образом:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

Логические операторы:

  • &&логическое И
  • ||логическое ИЛИ

Эти ярлыки позволяют выполнять арифметическую операцию, а затем присваивать:

  • +=
  • -=
  • *=
  • /=
  • %=

Есть еще несколько операторов, но это самые распространенные.

Вы можете распечатать что угодно на экране, используяechoкоманда:

#!/bin/bash
echo "test"
echo test
echo testing something

Логические условия

И: оценивается как0(ноль), если обаcommandиanothercommandвыполнить и вернуть0. Возвращение нуля в командах оболочки означает, что команда была успешной. Сообщение об ошибке идентифицируется ненулевым возвращаемым значением.

command && anothercommand

ИЛИ: оценивается как0(ноль), если хотя бы один изcommandиanothercommandвыполнить и вернуть0.

command || anothercommand

НЕ: инвертировать логическое возвращаемое значениеcommand:

! command

Структуры управления

Вы можете использовать несколько структур управления, с которыми вы, возможно, знакомы:

Операторы if / else

Простойif:

if condition
then
  command
fi

ifтогдаelse:

if condition
then
  command
else
  anothercommand
fi

Вложенныйif- тогда -else:

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

Вы можете оставитьelseв той же строке, используя точку с запятой:

if condition ; then
  command
fi

Пример:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

Обратите внимание на скобки? Мы должны добавлять скобки, когда нам нужно выполнить какую-либо оценку логического выражения.

Петли

Пока цикл

Покаconditionразрешается в истинное значение, запуститеcommand

while condition
do
  command
done

До того как

До того какconditionразрешается в истинное значение, запуститеcommand

until condition
do
  command
done

Для в

Итерировать список и выполнить команду для каждого элемента

for item in list
do
  command
done

Прервать и продолжить

Внутри петель вы можете использоватьbreakиcontinueоператоры, чтобы полностью разорвать цикл или просто пропустить текущую итерацию.

Дело

Структура контроля случая позволяет вам выбирать разные маршруты в зависимости от значения.

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

Как сfi,esacзавершает структуру кейса и, как вы можете заметить,caseнаписано наоборот.

Мы добавляем двойную точку с запятой после каждого случая.

А*)case будет обрабатывать все случаи, не указанные явно. Используя|символ, вы можете выразить несколько вариантов для одного случая.

Пример:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

Выбирать

АselectСтруктура показывает пользователю меню выбора на выбор:

select item in list
do
  command
done

Пример:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

Условия тестирования

Я использовал терминconditionв приведенных выше структурах управления.

Вы можете использоватьtestВстроенная команда Bash для проверки условия и возврата истинного (0) или ложное значение (не0).

Вот пример:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

Чтение ввода из командной строки

Вы можете сделать свои скрипты интерактивными, используяreadвстроенная команда. Эта команда считывает строку из стандартного ввода и может очень гибко форматировать ввод.

Самое простое использование:

echo "Age:"
read age

это будет напечатать «Возраст:», и вы можете ввести номер, нажать Enter, и этот номер будет присвоенageПеременная.

В-pвариантreadпредоставляет встроенную подсказку и помещает ввод вageПеременная:

read -p "Age: " age

ВreadУ команды есть еще много параметров, которые вы можете проверить, набравhelp readв Баш.

Добавление опций

Параметры указываются с помощью дефиса, за которым следует буква, например:

ls -a
driveCar -b "Ford"

В своем коде вы используете встроенную командуgetoptsчтобы проанализировать варианты и получить значение.

Если мы примем вариантыaиb, мы кормимgetopts abв цикл while.

Если вариантbпринимает значение, мы добавляем двоеточие:после этого, поэтому мы форматируем нашgetoptsпозвоните так:getopts ab: arg

Вот отрывок:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

В этом сценарии$OPTARGавтоматически назначается буква варианта. Мы говоримgetoptsкакие варианты мы принимаем, и мы обрабатываем каждый случай отдельно.

Ошибки обрабатываются автоматическиgetopts. Мы можем самостоятельно обрабатывать сообщения об ошибках, добавив двоеточие:перед определением аргументов:getopts :xy: arg.

Затем мы также обрабатываем\?и:случаи. Первый вызывается, когда мы передаем недопустимую опцию, а второй вызывается, когда мы пропускаем опцию:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

Теперь, если вы пропустите добавление аргумента, сообщения об ошибках будут другими.

Работа с параметрами

Внутри скрипта вы можете получить доступ к любому параметру, который был передан во время вызова. Вы получаете к ним доступ, используя$0,$1,$2и так далее, в зависимости от позиции, где$0- это имя команды, и при увеличении числа увеличивается позиция параметра. После позиции 9 нужны фигурные скобки:${10},${11}

Например, запуск этогоstartCarсценарий:

#!/bin/bash
echo $0
echo $1

в качестве./startCar fiestaнапечатает

./startCar
fiesta

Специальный$*синтаксис печатает все параметры и$#количество переданных параметров:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

Отделение опций от параметров

Если у вас есть и опции, и параметры, вам необходимо их разделить. Вы делаете это через дефис:

driveCar -m "Ford Fiesta" - Milan Florence Rome

Работа со строками

Учитывая строку:

dogname="Roger"

Вы можете получить его длину, используя${#dogname}

Всегда используйте кавычки вокруг строк при работе с ними, чтобы Bash не интерпретировал внутри них специальные символы.

Вы можете сравнить 2 строки, используя=или же==оператор, то же самое:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

Это не задание из-за пробелов, окружающих=.

Вы также можете проверить неравенство:

"$dogname" != "$anotherdogname"

Массивы

Массив - это список элементов, объявленных в круглых скобках:

breeds=(husky setter "border collie" chiwawa)

Вы можете ссылаться на любой элемент внутри массива, используя квадратные скобки:

breeds[0]
breeds[1]

и вы можете получить общее количество элементов, используя этот специальный синтаксис:

${#breeds[@]}

Встроенные команды

До сих пор вы уже видели несколько встроенных команд, например:

  • test
  • read
  • echo

У Баша их несколько. Вы можете увидеть их всех, позвонивhelpа затем вы можете найти справку для каждой команды, используя, например,help read.

Функции

Как и в JavaScript или на любом другом языке программирования, вы можете создавать небольшие повторно используемые фрагменты кода, давать им имена и вызывать их, когда вам нужно.

Баш называет ихфункции.

Вы определяете функцию с помощью

function name {

}

Пример:

function cleanFolder {

}

и вы вызываете его так:

cleanFolder

Вы можете передавать параметры папкам без необходимости их объявления - вы просто ссылаетесь на них как$1,$2и т. д. Как и для параметров скрипта:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

Скачать мою бесплатнуюСправочник по командам Linux


Больше руководств по cli: