Написание скрипта на bash

Код не всегда легче набирать ручками...лучше, если он уже написан в виде скрипта...

Например:

#!/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

 

 

Добавить комментарий


Защитный код
Обновить

Вы здесь: Сайтостроение Сисадмин Написание скрипта на bash