В этой статье мы используем многое из того, что мы изучали в предыдущих статьях. Если что-то покажется не совсем понятным, вернитесь к уже изученным статьям, чтобы освежить свою память.
Что такое bash-скрипты
Bash-скрипт (от англ. script — сценарий) — это последовательность команд, которые по очереди считывает и выполняет интерпретатор. В нашем случае это командная строка — bash.
Скрипт — что-то вроде театрального сценария. В театре это некий документ, в котором указано, кто что должен говорить и делать. Сценарий читает исполнитель — актер — и выполняет «команды». В компьютерных скриптах сценарий (скрипт) читает и выполняет компьютер.
Компьютерный сценарий — это обычный текстовый файл, в котором перечислены обычные команды. Отличие заключается в том, что раньше мы вводили эти команды вручную в терминал, а в скрипте их будет «вводить» интерпретатор — bash. Скрипт можно создать как и любой другой текстовый файл с помощью обычного текстового редактора: например, VI, который мы обсуждали в этой статье.
#122. Запуск bash скрипта командой в Ubuntu
Совет. Всё, что можно записать в скрипт, можно точно вручную запустить в командной строке с тем же результатом. Поэтому отдельные части скрипта при его создании удобно тестировать непосредственно в командой строке, вручную вводя команды.
Разберем на примере
Ниже — простой скрипт. Он выводит сообщение на экран с помощью команды echo, а затем — список того, что находится в вашем текущем каталоге.
Попробуйте сами создать текстовый файл, скопировать туда команды из этого скрипта и запустить его, чтобы понять, как он работает.
#!/bin/bash
# Демонстрационный скрипт
# karpaff 22/01/2022
echo Список файлов в текущем каталоге:
ls
Теперь давайте разбираться, как всё устроено, с помощью командой строки. Ниже — объяснение, что тут происходит.
1. [email protected]: cat myscript.sh
2. #!/bin/bash
3. # Демонстрационный скрипт
4. # karpaff 22/01/2022
5.
6. echo Список файлов в текущем каталоге:
7. ls
8. [email protected]:
9. [email protected]: ls -l myscript.sh
10. -rwxr-xr-x 1 karpaff users 2 Jan 22 2022 myscript.sh
11. [email protected]:
12. [email protected]: ./myscript.sh
13. Список файлов в текущем каталоге:
14. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
15. [email protected]:
- Строка 1. Посмотрим на наш скрипт. Linux — система без расширений, поэтому скрипты не обязаны иметь расширение .sh. Однако обычно его ставят, чтобы скрипты было сразу заметно.
- Строка 2. Самой первой строкой скрипта всегда должна быть эта строка — она указывает, какой интерпретатор следует использовать. Первые два символа называются шебанг (shebang). После этого без пробелов указывается путь к интерпретатору. О лучших практиках shebang можно почитать здесь.
- Строки 3 и 4. Всё, что идет после # — комментарий. Интерпретатор игнорирует их, они нужно для нашего удобства. Хорошая практика — указывать ваше имя и дату написания скрипта, а также краткое описание того, что этот сценарий делает.
- Строка 6. Мы будем использовать программу под названием echo Она просто выводит на экран всё, что вы поместите справа от нее.
- Строка 7. Выводим на экран содержимое текущего каталога с помощью команды ls .
- Строка 9. У сценария должно быть разрешение execute, чтобы его можно было запустить. Как вы видите, у нашего файла есть такое разрешение.
- Строка 12. Запускаем сам скрипт. Зачем нужно ./ расскажем чуть ниже.
- Строки 13 и 14. Результат работы нашего скрипта.
Шебанг
Самая первая строчка скрипта указывает системе, какой интерпретатор следует использовать для этого файла. В ней не должно быть пробелов. Первые два символа #! — так называемый шебанг (shebang), который говорит системе, что сразу после них идет путь к используемому интерпретатору.
Как запускать программы Linux в Windows при помощи Bash эмулятора
Если вы не знаете, где находится нужный интерпретатор, можно использовать команду which .
1. [email protected]: which bash
2. /bin/bash
3. [email protected]:
4. [email protected]: which ls
5. /usr/bin/ls
6. [email protected]:
Строчку с указанием на интепретатор можно не писать, и bash-скрипт всё равно будет работать. Большинство оболочек, включая bash, в таком случае будут считать интерпретатором себя. Однако всегда указывать интепретатор — хорошая привычка. Если вы или кто-то другой запустите скрипт в условиях, когда bash не используется в качестве оболочки, сценарий может работать не так, как задумывалось.
Имя
Linux — это ОС без расширений. Это значит, что мы можем назвать наш скрипт как угодно, и это никак не повлияет на его выполнение. Обычно для скриптов все-таки записывают расширение .sh, но это делатеся исключитьельно для удобства. Наш скрипт можно было назвать и просто myscript или даже myscript.jpg — он бы всё равно работал так же.
Когда мы вводим команду в терминале, система проходит по заданному ряду каталогов в поисках этой команды. Этот путь можно увидеть с помощью переменной PATH .
1. [email protected]: echo $PATH
2. /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
3. [email protected]:
Сначала система ищет команду в первой директории. Если она там есть, команда запускается, если нет — система проверяет вторую директорию и так далее. Каталоги разделяются : (двоеточие).
Система не будет искать команду нигде, кроме перечисленных каталогов. Это поведение можно изменить, указав путь. В таком случае система как бы говорит: «Вы сказали мне, где искать скрипт, поэтому я проигнорирую PATH и пойду сразу в указанное место».
В статье «Основы навигации» мы уже обсуждали, что . (точка) означает текущий каталог, поэтому, когда мы пишем ./myscript.sh , мы фактически говорим системе искать скрипт в текущем каталоге.
Bash Скрипты
Если четвёртый символ это — то файл не является исполняемым.
Сделать его исполняемым можно командой
chmod u+x script_1
-rwxrw-r—. 1 andrei andrei 5252 Jul 03 05:47 script_1
Обратите внимание на -rwx теперь четвёртый символ это x
В моей CentOS настроена подсветка исполняемых файлов, поэтому он теперь зелёный
Теперь выполнить скрипт можно командой
Конкретно этот скрипт должен принимать аргументы из командной строки , поэтому мы выполним
./script_1 word1 word2
word1 добавится в log.txt а word2 нет, потому что word1 это первый аргумент а word2 второй.
Чтобы записывать вообще все аргументы заменим $1 на $*
Добавим в лог время выполнения команд (подробности здесь)
#!/bin/bash # Читаем из терминала и записываем в лог echo $( date + » %Y-%m-%d %H:%M:%S,%3N » ) $*
./script_1 one two three
cat log.txt
2023-07-03 05:47:35,404 one two three
Как вызвать скрипт из другого скрипта
Допустим из скрипта parent.sh вам нужно вызвать скрипт child.sh
#!/bin/bash # parent bash ./child.sh
Это если они в одной директории, если в разных — пишите путь до скрипта
Как назвать скрипт
Проверить не занято ли имя системой можно командой type.
Например, вы решили назвать свой скрипт test
test is a shell builtin
То есть имя занято, вы, конечно, можете его использовать, но с вызовом будут дополнительные сложности.
Вывод команды в переменную
Часто бывает нужно выполнить из скрипта команду и присвоить результат переменной.
Чтобы сделать это воспользуйтесь синтаксисом
ПЕРЕМЕННАЯ=$(КОМАНДА)
Например, вам нужно проанализировать лог на количество ошибок и предупреждений
#!/bin/bash ERROR=$(grep -o -i ERROR 2023-07-03-log.txt | wc -l) WARNING=$(grep -o -i WARNING 2023-07-03-log.txt | wc -l) echo «Ошибок: $ERROR; Предупреждений: $ WARNING»
wc это команда, которая подсчитывает число слов
Аргументы из командной строки
Скрипт может принимать аргументы из командной строки
Первый аргумент обозначается как $1 второй как $2 и так далее
Рассмотрим пример ar.sh
#!/bin/bash AR = $1 echo $AR $AR $AR ~
Этот скрипт ждёт один внешний аргумент и присваивает его значение переменной AR
Затем это же значение выводится три раза
В C аналогичную функцию выполняет int argc, char* argv[]
Цикл for
В самом привычном виде цикл for можно записать так
#!/bin/bash for i in `seq 0 9 ` ; do echo $i done
Объединить строки
Конкатенация строк может быть сделана следующим образом
#!/bin/bash STR1 = » heihei » STR2 = » .ru » STR3 = $STR1$STR2 echo $STR3
Функции
Чтобы не писать длинные команды вручную можно объединить их в функции.
Например, нужно менять местами экраны с помощью xrandr это довольно длинная команда и чтобы не выполнять эту команду каждый раз после перезагрузки можно написать функцию в .bashrc
Перезайдите в терминал.
Теперь, чтобы поменять экраны местами достаточно выполнить
Ещё один пример — функция внутри обычного скрипта, она может принимать аргументы, но пока что просто возвращает hi
#!/bin/bash export LANG =en_US.UTF-8 say_hi() echo » hi » > say_hi
Изменим код так, чтобы передать имя в функцию
#!/bin/bash export LANG =en_US.UTF-8 say_hi() smb = $1 echo » hi » $smb > say_hi Andrei
Проверить существование команды
Проверить доступность или отсутствие команды можно с помощью command.
Например, проверка наличия firewall-cmd
if ! command -v firewall-cmd /dev/null then echo » firewall is not found » exit else echo » firewall is found » exit fi
Источник: www.andreyolegovich.ru
Создайте и запустите свой первый скрипт Bash Shell
С делайте первый шаг к созданию сценариев оболочки. Узнайте, что нужно для создания простого bash-скрипта и как его запустить.
Если вам нужно сделать это более одного раза, автоматизируйте это!
Вы часто будете повторять одну и ту же задачу в Linux снова и снова. Это может быть простая резервная копия каталога, очистка временных файлов или даже клонирование базы данных.
Автоматизация задачи — один из многих полезных сценариев, в которых вы можете использовать возможности сценариев bash.
Позвольте нам показать вам, как создать простой скрипт оболочки bash, как запустить скрипт bash и что вы должны знать о сценариях оболочки.
Создайте и запустите свой первый скрипт оболочки
Давайте сначала создадим новый каталог с именем scripts, который будет содержать все наши скрипты bash.
mkdir scripts cd scripts
Теперь внутри этого «каталога скриптов» создайте новый файл с именем hello.sh с помощью команды cat:
cat > hello.sh
Вставьте в него следующую строку, набрав ее в терминале:
echo ‘Hello, World!’
Вы также можете использовать текстовый редактор на основе терминала, такой как Vim, Emacs или Nano. Если вы используете настольный Linux, вы также можете использовать графический текстовый редактор, такой как Gedit, чтобы добавить текст в этот файл.
Итак, в основном вы используете команду echo для вывода «Hello World». Вы можете использовать эту команду непосредственно в терминале, но в этом тесте вы запустите эту команду через скрипт оболочки.
chmod u+x hello.sh
И наконец, запустите ваш первый скрипт оболочки, добавив hello.sh желаемую оболочку «bash»:
bash hello.sh
Вы увидите Hello, World!, напечатанные на экране. Возможно, это была самая легкая программа Hello World, которую вы когда-либо писали, верно?
Конвертируйте ваш скрипт в bash
Bash означает “Bourne-Again shell”, — это всего лишь одна из многих доступных оболочек в Linux.
Читать Команды break и continue. Оболочка Bash. Linux.
Оболочка — это интерпретатор командной строки, который принимает и запускает команды. Если вы когда-либо запускали какую-либо команду Linux раньше, то вы использовали оболочку. Когда вы открываете терминал в Linux, вы уже используете оболочку по умолчанию вашей системы.
Bash часто является оболочкой по умолчанию в большинстве дистрибутивов Linux. Вот почему bash часто является синонимом оболочки.
Сценарии оболочки часто имеют почти одинаковые синтаксисы, но иногда они также различаются. Например, индекс массива начинается с 1 в Zsh вместо 0 в bash. Скрипт, написанный для оболочки Zsh , не будет работать так же в bash, если у него есть массивы.
Чтобы избежать неприятных сюрпризов, вы должны сообщить интерпретатору, что ваш сценарий оболочки написан для оболочки bash.
Строка SheBang в начале сценария оболочки
Строка «#!/Bin/bash» называется строкой shebang, а в некоторых литературах она называется строкой hashbang, и это потому, что она начинается с двух символов хеша «#» и bang «!».
#! /bin/bash echo ‘Hello, World!’
Когда вы добавляете строку «#!/Bin/bash» в самом верху вашего скрипта, система знает, что вы хотите использовать bash в качестве интерпретатора для вашего скрипта. Таким образом, вы можете запустить скрипт hello.sh прямо сейчас, не добавляя ему bash.
Добавление сценария оболочки в PATH (чтобы его можно было запустить из любого каталога)
Возможно, вы заметили, что мы использовали ./hello.sh для запуска скрипта; вы получите ошибку, если пропустите ведущий ./
Bash подумал, что вы пытаетесь запустить команду с именем hello.sh. Когда вы запускаете любую команду на вашем терминале; он ищет эту команду в наборе каталогов, которые хранятся в переменной PATH.
Вы можете использовать echo для просмотра содержимого этой переменной PATH:
echo $PATH /home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Символ двоеточия (:) разделяет путь каждого из каталогов, которые сканирует ваша оболочка при каждом запуске команды.
Команды Linux, такие как echo, cat и т. д., можно запускать откуда угодно, потому что их исполняемые файлы хранятся в каталогах bin. Каталоги bin включены в PATH. Когда вы запускаете команду, ваша система проверяет PATH на все возможные места, которые она должна искать, чтобы найти исполняемый файл для этой команды.
Читать Заявление Case в Bash
Если вы хотите запустить свой bash-скрипт из любой точки мира, как если бы это была обычная команда Linux, добавьте местоположение вашего сценария оболочки в переменную PATH.
Во-первых, найдите местоположение каталога вашего скрипта (если вы находитесь в том же каталоге), используйте команду PWD:
Используйте команду export, чтобы добавить каталог скриптов в переменную PATH.
export PATH=$PATH:/home/user/scripts
Обратите внимание, что мы добавили «каталог скриптов» в самый конец нашей переменной PATH. Так что пользовательский путь ищется после стандартных каталогов.
Момент истины здесь, запустите hello.sh:
Он работает! Это подводит нас к концу этой статьи. Мы надеемся, что теперь у вас есть некоторое представление о сценариях оболочки.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник: andreyex.ru