Начало скрипта
#!/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"