Skip to content

Bash scripts

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

Примеры скриптов и их описание

Ниже будут приведены примеры скриптов

Создание скрипта

  1. Создать текстовый файл через vim <file>.sh или командый touch + nano
  2. Записать скрипт в файл
  3. Сохранить
  4. Выполнить chmod +x <file>
  5. Выполнить скрипт bash <file> или ./<file>

alias

  • Псевдонимы или алиасы (англ. alias) — это команды, которые можно определить самостоятельно.
ubuntu@linux:~$ alias ll='ls -l'
ubuntu@linux:~$ ll
total 4
-rw-rw-r-- 1 ubuntu ubuntu  0 May 13 17:51 echo
-rwxrwxr-x 1 ubuntu ubuntu 66 May 13 17:31 hello.sh

PATH

  • PATH - файл, который хранит переменные окружения. Пути к исполняемым файла в директориях

echo $PATH - просмотр файла export PATH="${PATH}:<новая директория которую хотите добавить>" - добавление нового пути

Очень

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

Hash

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

ubuntu@linux:~$ hash
hits    command # hits - указывает на колличество запусков этой команды
   1    /usr/bin/chmod
   1    /usr/bin/man
   3    /usr/bin/ls
   4    /usr/bin/bash
   1    /usr/bin/ps
   4    /usr/bin/vim
  • Если вы хотите очистить хеш-таблицу, можете использовать команду hash -r.
  • Добавление в хеш-таблицу: hash <имя_команды>.
  • Удаление из хеш-таблицы: hash -d <имя_команды>.

Массивы в Bash

В Bash массивы можно объявлять с помощью ключевого слова declare

$ declare -a MY_ARRAY
$ MY_ARRAY[0]="Hello"
$ MY_ARRAY[1]="World"
$ echo ${MY_ARRAY[0]} ${MY_ARRAY[1]}!
Hello World!
Или передавать значения в скобках
$ MY_ARRAY=("Hello" "World")
$ echo ${MY_ARRAY[0]}, ${MY_ARRAY[1]}!
Hello, World!

Конструкцию declare -r можно заменить на одно ключевое слово readonly. Атрибут readonly хорошо подходит для больших, развесистых скриптов, где много переменных и сложно отследить, где и какая меняется.

$ readonly MY_VARIABLE="Hello, World!"
$ MY_VARIABLE="Hello, World?"
bash: MY_VARIABLE: readonly variable

Специальные Переменные

Bash хранит код возврата последней выполненной команды в специальной переменной $?

$ bash -c "exit 2"
$ echo $?
2

Переменная $IFS (Internal Field Separator) используется для определения символа, который разделяет слова в строках. В операторе циклов for список элементов разделяется с использованием значения IFS

#!/bin/bash

# Пусть на вход поступает набор слов, разделённых двоеточием
line="home-directory:bash-directory"
# Переопределим IFS
IFS=":"
# Создадим массив
tokens=($line)

echo "${tokens[0]}"  # Выводит "home-directory"
echo "${tokens[1]}"  # Выводит "bash-directory"

Переменная $$ содержит идентификатор процесса оболочки

Переменная $! содержит идентификатор последнего запущенного фонового процесса

Ввод аргумента и if-else

if [ "$1" ] ; then
        echo "Hello {$1}"
else
        echo "Hello World"
fi

Описание:

  • if объявление начала консрукции
  • В квадратных скобках пишется условие. В данном случае мы ожидаем "что-то" в первом аргументе, который передадим скрипту
  • После скобок идет ; then, что выполниться в случае выполнения условия
    • Скрип выведет в терминал Hello <переданный аргумент>
  • else чтобы будет, если условие не выполнено.
    • В терминале будет Hello World
  • fi закрытие конструкции

Подсказка

Аргументы в скриптах Bash доступны через переменные $1, $2, $3 и т.д.