wiki

test2

View on GitHub

Начало скрипта
#!/bin/bash

Запуск скрипта
sudo chmod +x <file.sh> - дает право на выполнению скрипту в системе
./<file.sh> - запуск скрипта
bash <file.sh> - запуск скрипта
/home/dir/<file.sh> - запуск скрипта

Команды
echo <текст> - вывод текста
# - начало комментария
'<текст>' - в одинарных кавычках экранируются все служебные символы
exit - завершит скрипт
read <переменная> - записать введенное пользователем значение

Переменные
- имя (name)
буквы, цифры, _;
не может начинаться с цифры.

- значение (value)
числа;
строки (если есть пробелы, то в кавычках);
отдельные символы.

- Запись (перезапись) значения
<имя>=<значение> (пробелы ставить нельзя)
var=$( cat foo.txt ) - записать содержимое файла в переменную

- Чтение
$<имя> или ${<имя>}

Аргументы
- Передача аргументов скрипту
./file.sh arg1 arg2 arg3 …

- Обработка внутри скрипта
$1 - первый аргумент
$2 - второй аргумент
$n - n аргумент
$0 - имя скрипта
$# - количество аргументов

Ветвление: if

if [[условие]]
then
     # действие, если условие истинно
fi

if [[условие]]
then
     # действие, если условие истинно
else
     # действие, если условие истинно
fi

if [[условие1]]
then
     # действие, если условие истинно
elif [[условие2]]
then
     # действие, если условие истинно
else
     # действие, если условие истинно
fi

- Условие (строки)
-z <строка> #строка пуста
-n <строка> #строка не пуста
<строка1> == <строка2> #строки равны
<строка1> != <строка2> #строки не равны

- Условия (числа)
-eq #равно
-ne #не равно
-lt #меньше
-le #меньше или равно
-qt #больше
-qe #больше или равно

- Условия (файлы)
-e <путь> #путь существует
-f <путь> #это файл
-d <путь> #это директория
-s <путь> #размер файла больше 0
-x <путь> #файл исполняемый

- Условия (логические)
! #отрицание логического выражения
&& #логическое "И"
|| #логическое "ИЛИ"

Пример условия:

if [[ !(-e $1) || !(-f $1) ]]
if [ "$2" -lt "10" ]

Ветвление: case

case <переменная> in
  <значение1>)
     # действие, если <переменная>==<значение1>
  ;;
  <значение2>)
     # действие, если <переменная>==<значение2>
  ;;
  *)
     #действие если переменная не равна не одну из значений
esac

Цикл: for

for <переменная> in <значение1>  <значение2> ...
do
     #действие, каждый раз переменная принимает следующее значение из списка@@
done

- Команды
break - прервать выполнение
continue - перейти на следующее значение

Цикл: wire

while [[условие]]
do
     #действие, пока условие истинно
done

Арифметика
- Синтаксис
let "<переменная>=<выражение>"

- Операции
+, -, /, * - стандартные
% - остаток от деления
** - возвести в степень

Внешние программы
- Синтаксис
переменная = `программа`

- Код возврата
0 - корректное завершение
не 0 - в процессе работы были ошибки

- Узнать код только что выполненной программы
$?

-Выйти с кодом
exit <код>

-Проверка кода возврата

if `программа`
     #действие, если код 0
then
else
     #действие, если код не 0
fi

Функции
- Задаем функцию
<имя функции> (){
#действие $1 (arg1), $2 (arg2), $# всего аргументов
}

- Используем функцию
<имя функции> arg1 arg2 …

- Перемеренные
<переменная>=<значение> - создаст глобальную переменную
local <переменная>=<значение> - создаст локальную переменную

чтение проперти файлов
https://stackoverflow.com/questions/28830225/how-to-read-a-properties-file-which-contains-keys-that-have-a-period-character

шаблоны

проверка на ошибку выполнения скрипта

./script.sh
if [ "$?" -eq 1 ]; then
  #if has error (sh return "exit 1")
  echo "error"
fi

получить текущую папку

full_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

чтение проперти файла

function prop {
    #read properties
    grep "^\\s*${1}=" "$full_dir"/script.properties|cut -d'=' -f2
}
echo "$(prop 'some.key')"

#file
script.properties{
some.key=value
}

Существует ли файл

if [[ ! (-e $1) || ! (-f $1) ]]
then
    echo "file not exist"
fi

Выйти с ошибкой

catch_err() {
  #print error
  printf "%s\n" "$*" >&2;
  exit 1
}

catch_err "fail"