Skip to main content

Bash скрипты

При запуске скрипта создается дочерняя консоль, в ней выполняется скрипт и результат возвращается в консоль.

Можно запускать через source, имя (если . в PATH), ./... , и ./ ... & С фоновой задачей аккуратно с объемом вывода, ^C не работает.

Функции


function functname
{
shell commands
}

functname ( )
{
shell commands
}

Используют позиционные переменные. 

functname "one" $7

Если внутри функции нужна локальная переменная, то local var1="something", иначе используется глобальная переменная.

Программы для работы с функциями

declare -f список функций с описанием

-F только имена функций
unset fname удалить функцию из памяти
type fname Описание функции

-t выведет тип

Приоритет при вызове из консоли

  1. Aliases
  2. Служебные слова типа if, ...
  3. Функции
  4. Встроенные команды типа cd, type, ...
  5. Скрипты и исполняемые команды

Переменные

Описывается $varname или ${varname} Например есть переменная UID. Для вывода 0_ нужно использовать echo ${varname}_

$1, $2, ... Позиционные параметры
$* Строка, содержащая все параметры через пробел
$@ Равна N строкам-параметрам. Актуально при передаче в функции.
$# Количество аргументов
var1=$(cmd) Сохранение результата cmd в переменную

Определение глобальной переменной: var1="something"

Обработка значений переменных перед вводом

${varname:-word } Если переменная не существует или существует но пустая - вернет word
${varname:=word} Если переменная не существует или существует но пустая - присвоит ей word и вернет word
${varname:?message} Если переменная не существует или существует но пустая - выведет сообщение и завершит скрипт
${varname:+word} Если переменная существует или пустая - вернет word, иначе null
${varname:offset:length}

Срез. 

count=frogfootman

${count:4} вернет footman

${count:4:4} вернет foot

Обработка переменных 

${var#pattern}

 


Если шаблон совпадает с началом значения переменной - удалить самую короткую часть от начала строки с совпадением и вернуть результат

var="/home/user/docs/file.txt"
echo ${var#*/}   # home/user/docs/file.txt   (отрезан только первый "/")

${var##pattern}

var="/home/user/docs/file.txt"

echo ${var##*/}  # file.txt                  (отрезано всё до последнего "/")

${variable%pattern}

file="archive.tar.gz"

echo ${file%.*}   # archive.tar

${variable%%pattern}

file="archive.tar.gz"

echo ${file%%.*}  # archive 

${variable/pattern/string}

Наибольшее совпадение шаблона с переменной заменяется строкой. Первое совпадение

${variable//pattern/ string}

Наибольшее совпадение шаблона с переменной заменяется строкой. Все совпадения


 echo -e ${PATH//:/'\n'}

выведет разделенное через : значение в значения списком

Длина значения ${#filename}