Написание скрипта на bash
- Подробности
- Категория: Сисадмин
- Просмотров: 175
Код не всегда легче набирать ручками...лучше, если он уже написан в виде скрипта...
Например:
#!/bin/bash
echo "Hello world"
Первая строка говорит о том, что для обработки нашего сценария нужно вызвать оболочку bash, а далее уже идет сам скрипт. В данном случае он простой и просто выводит hello world. Но это для теста.
После написания скрипта, надо сделать его исполняемым:
chmod ugo+x filename
смотрите подробнее - как сделать файл исполняемым в Linux
И далее, запускаем его так:
./filename
Переменные
Как и в любом языке программирования в bash также используются переменные для хранения.
$str="Hello world"
Но, ПРОБЕЛЫ тут являются РАЗДЕЛИТЕЛЯМИ, которые разделяют команды, поэтому перед равно и после не ставят, а текстовое берут в кавычки, чтобы пробел между ними не был командой также.
str1="Hello "
str2=world
str=$str1$str2
echo $str
Видите, переменные объявляются без знака $, а вот вызываются именно с ним. Также, во второй строчке видно, что не поставили кавычки, потому что нет пробелов там.
Вывод времени:
date
или тоже самое:
echo $(date)
Присвоим дату переменной:
или тоже самое:
d=$(date)
так не сработает:
d=date
Параметры скриптов
Написали вы скрипт и хотите, чтобы он обработал ВХОДЯЩИЙ параметр, их может быть много. Рассмотрим 1 для начала:
#!/bin/bash
echo $1
Теперь передадим в него параметр для обработки через пробел после имени скрипта:
./filename saitsozdanie.ru
и вместо $1 будет выведен как раз наш параметр
Управляющие конструкции
Для того, чтобы в скриптах управлять поведением и выставлять условие тут также работают управляющие конструкции:
Условие, если - то:
if команда_условие then команда else команда fi
тут нет угловых скобок разных перед и после операторов, как в языках программирования
!!! Если команда_условие успешно (РАВНО 0) - то выполняется условие в блоке than, если неуспех(равно 1) - то выполняется блок else. Что отличает от других языков программирования.
Что означают квадратные скобки в bash скриптах
В них происходит сравнение:
сравнение целых чисел
- -eq
-
равно
if [ "$a" -eq "$b" ]
- -ne
-
не равно
if [ "$a" -ne "$b" ]
- -gt
-
больше
if [ "$a" -gt "$b" ]
- -ge
-
больше или равно
if [ "$a" -ge "$b" ]
- -lt
-
меньше
if [ "$a" -lt "$b" ]
- -le
-
меньше или равно
if [ "$a" -le "$b" ]
- <
-
меньше
(("$a" < "$b"))
- <=
-
меньше или равно (внутри двойных круглых скобок)
(("$a" <= "$b"))
- >
-
больше (внутри двойных круглых скобок)
(("$a" > "$b"))
- >=
-
больше или равно (внутри двойных круглых скобок)
(("$a" >= "$b"))
- =
-
равно
if [ "$a" = "$b" ]
- ==
-
равно
if [ "$a" == "$b" ]
Синоним оператора =.
[[ $a == z* ]] # истина, если $a начинается с символа "z" (сравнение по шаблону) [[ $a == "z*" ]] # истина, если $a равна z* [ $a == z* ] # имеют место подстановка имен файлов и разбиение на слова [ "$a" == "z*" ] # истина, если $a равна z*
- !=
-
не равно
if [ "$a" != "$b" ]
Этот оператор используется при поиске по шаблону внутри
- <
-
меньше, в смысле величины ASCII-кодов
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
Обратите внимание! Символ "<" необходимо экранировать внутри [ ].
- >
-
больше, в смысле величины ASCII-кодов
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
Обратите внимание! Символ ">" необходимо экранировать внутри [ ].
- -z
-
строка "пустая", т.е. имеет нулевую длину
Далее, людям часто нужно сравнить значения, для этого есть [[]] - двойные скобочки
Например, прям в терминале наберите:
[[ 3 > 2 ]]
потом:
echo $?
и увидите ноль - 0 - означает верно, 3 больше 2
И сразу пишем скриптик:
if [[ $1 > 5 ]]
then
echo $1" больше 5"
else
echo $1" меньше 5 или 5"
fi
Циклы
Есть задачи, которые нужно выполнять по кругу - часами, то есть, любое количество времени, и в этом помогут циклы.
Цикл for
for переменная in список do команда done
Пример:
#!/bin/bash
for index in 1 2 3 4
do
echo $index
done
переберет все в in и запишет в index, а потом выведет в блоке do и в конце скрипта закрытие цикла - done.
Реальный пример и практика:
- нужно перечислить файлы в данном каталоге, где мы находимся:
for file in $(ls -l); do echo "$file"; done
Как мы видим можно записать скрипт в одну строчку и разделять основные блоки с помощью точки запятой.
Цикл while
while команда условие do команда done
Пример:
#!/bin/bash
index=1
while [[ $index < 6 ]]
do
echo $index
let "index=index+1"
done
опять будут выведены цифры до 5, не включая 6
в данном случае, новое выражение, присвоение значение через let
Массивы
#!/bin/bash
# Объявляем простой массив с 4 элементами
AR=( 'Debian' 'Redhat' Ubuntu)
# Получаем количество элементов в массиве
elem=${#AR[@]}
# выводим в цикле каждый элемент массива
for (( i=0;i<$elem;i++)); do
echo ${AR[${i}]}
done
Вывод такой:
Debian
Redhat
Ubuntu
Еще полезно:
Синтаксис | Описание |
---|---|
for do done |
Продолжить цикл для заданного количества строк, файлов и т.д. |
until do done |
Продолжать цикл до тех пор, пока не будет выполнено определенное условие |
while do done |
Продолжать цикл до тех пор, пока определенное условие истинно |
break |
Выйт из цикла и перейти к следующей части скрипта Bash |
continue |
Выйти из текущей итерации цикла, но продолжить выполнение цикла |
Теперь вы можете установить скрипт просмотра уязвимости на вашем сервере и проверить все ли там нормально - LBSA
---
Данные, которые вам пригодятся при написании скриптов на bash
exit |
Вывод из скрипта Bash, по желанию добавить код ошибки |
Ctrl + C |
Комбинация клавиш для остановки скрипта Bash в середине выполнения |
$( ) |
Выполнение команды внутри вложенной оболочки |
sleep |
Пауза на заданное количество секунд, минут, часов или дней |
Арифметические операции
+ |
Сложение |
- |
Вычитание |
* |
Умножение |
/ |
Деление |
% |
Модуль: возвращает остаток от деления |
** |
Raise to a power |
((i++)) |
Увеличение переменной |
((i--)) |
Уменьшение переменной |
Арифметические условные операторы
-lt | < |
-gt | > |
-le | <= |
-ge | >= |
-eq | == |
-ne | != |
Примеры скриптов на bash
1.
Простой архивирующий bash-скрипт
Архивируем директорию /home/user
#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user
Используем переменные и дату и преобразим скрипт:
#!/bin/bash
OF=myhome_directory_$(date +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF
2.
Глобальные и локальные переменные
#!/bin/bash
# Объявляем глобальную переменную
# Такая переменная может использоваться в любом месте этого скрипта
VAR="global variable"
function bash {
# Объявляем локальную переменную
# Такая переменная действительна только для функции, в которой её объявили
local VAR="local variable"
echo $VAR
}
echo $VAR
bash
# Обратите внимание, что глобальная переменная не изменилась
echo $VAR
3.
Для исполнения команд используем обратные кавычки
echo `uname -o`
Вывод: GNU/Linux / без кавычек не сработает!!!
4.
# скрипт будет считать до 10
for a in `seq 1 10`; do
echo "$a/10 to Exit."
sleep 1;
done
echo "Exit Bash Trap Example!!!"
5. Заполнение массива значениями из файла
для начала имеем bash.txt:
Debian
Redhat
Ubuntu
Linux
скрипт:
#!/bin/bash
# Объявляем массив с именем ARRAY
declare -a ARRAY
# Команда exec # stdin (обычно это клавиатура), будет производиться из этого файла. Это дает возможность читать
# содержимое файла, строку за строкой, и анализировать каждую введенную строку с помощью sed и/или awk.
exec 10<bash.txt
let count=0
while read LINE <&10; do
ARRAY[$count]=$LINE
((count++))
done
echo Number of elements: ${#ARRAY[@]}
# Вывод значений массива
echo ${ARRAY[@]}
# закрываем файл
exec 10>&-
Вывод такой:
Number of elements: 4
Debian Redhat Ubuntu Linux
6. if then и проверка существования директории
#!/bin/bash
directory="./BashScripting"
# проверяем наличие директории
if [ -d $directory ]; then
echo "Directory exists"
else
echo "Directory does not exists"
fi
Смотрите на пробелы в квадратных скобках - без них не заработает. Далее запускаем файл и проверяем
$ ./if_else.sh Directory does not exists $ mkdir BashScripting $ ./if_else.sh Directory exists
7. Цикл while и вложенные if-then
#!/bin/bash
# Объявляем переменную со значением 4
choice=4
# Выводим на экран
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
# Выполняем, пока переменная равна четырем
# Зацикливание - ТУТ ОСНОВНОЙ МОМЕНТ - так как выше переменная равна 4, то цикл ниже будет выполняться изначально и потом правалившись в него - уже там будет ловить следующий пользовательский ввод!
while [ $choice -eq 4 ]; do
# читаем пользовательский ввод
read choice
# вложенное "если-иначе" условие
if [ $choice -eq 1 ] ; then
echo "You have chosen word: Bash"
else
if [ $choice -eq 2 ] ; then
echo "You have chosen word: Scripting"
else
if [ $choice -eq 3 ] ; then
echo "You have chosen word: Tutorial"
else
echo "Please make a choice between 1-3 !"
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
choice=4
fi
fi
fi
done
Нижне даны варианты запуска и ответы
$ ./while-if.sh
1. Bash
2. Scripting
3. Tutorial
Please choose a word [1,2 or 3]?
5
Please make a choice between 1-3 !
1. Bash
2. Scripting
3. Tutorial
Please choose a word [1,2 or 3]?
4
Please make a choice between 1-3 !
1. Bash
2. Scripting
3. Tutorial
Please choose a word [1,2 or 3]?
3
You have chosen word: Tutorial