Подробный обзор написания сценариев для оболочки 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:
- Оболочка Bash
- Введение в сценарии оболочки Bash
- Раковина рыбы
- Оболочка, наблюдайте за содержимым файла по мере его заполнения
- Как выйти из Vim
- Редакторы UNIX
- Команды файловой системы UNIX
- Учебник по оболочкам Unix
- Как установить псевдоним в оболочке macOS или Linux
- Практическое руководство по домашнему пиву
- Как исправить ошибку неверного пути к активному разработчику xcrun в macOS
- Командная строка для начинающих
- Введение в Linux
- Как найти процесс, использующий порт
- Команды Linux: mkdir
- Команды Linux: cd
- Команды Linux: pwd
- Команды Linux: rmdir
- Команды Linux: ls
- Команды Linux: mv
- Команды Linux: cp
- Команды Linux: меньше
- Команды Linux: хвост
- Команды Linux: коснитесь
- Команды Linux: cat
- Команды Linux: найти
- Команды Linux: ln
- Команды Linux: ps
- Команды Linux: echo
- Команды Linux: вверх
- Команды Linux: kill
- Команды Linux: killall
- Команды Linux: псевдоним
- Команды Linux: вакансии
- Команды Linux: bg
- Команды Linux: fg
- Команды Linux: введите
- Команды Linux: какие
- Команды Linux: whoami
- Команды Linux: кто
- Команды Linux: очистить
- Команды Linux: su
- Команды Linux: sudo
- Команды Linux: chown
- Команды Linux: chmod
- Команды Linux: passwd
- Команды Linux: открыть
- Команды Linux: wc
- Команды Linux: история
- Команды Linux: du
- Команды Linux: umask
- Команды Linux: grep
- Команды Linux: man
- Команды Linux: uname
- Команды Linux: сортировка
- Команды Linux: uniq
- Команды Linux: diff
- Команды Linux: nohup
- Команды Linux: df
- Команды Linux: xargs
- Команды Linux: gzip
- Команды Linux: gunzip
- Команды Linux: ping
- Команды Linux: traceroute
- Команды Linux: tar
- Команды Linux: экспорт
- Команды Linux: crontab
- Команды Linux: dirname
- Команды Linux: базовое имя
- Команды Linux: printenv
- Команды Linux: env
- Краткое руководство по редактору ed
- Краткое руководство по vim
- Краткое руководство по emacs
- Краткое руководство по нано
- Linux, на устройстве не осталось места
- Как использовать Netcat