💻 Примеры — Завершение работы со скриптами

К оглавлению урока

⚡ Все скрипты кратко

# testscript.sh — архивирование
for i in {1..5}; do mkdir -p Dir$i; for j in {1..5}; do date +'%H-%M-%S' > Dir$i/File-$j.txt; sleep 5; done; done
tar -czvf /tmp/Arh/Arh-$(date '+%d-%m-%y').tar.gz Dir* >> ArhList.txt
tar -xzf /tmp/Arh/*.tar.gz -C /opt/newfolder

# pinger.sh — среднее время пинга
read -p "Адрес: " address; read -p "Кол-во: " count
ping -c "$count" "$address" | awk -F'/' '/^rtt/ { print $5 }'

# md5check.sh — контроль целостности
read -p "Путь: " pathcheck
for f in $pathcheck/*; do md5sum "$f" >> checksums.txt; done

# while true — бесконечный цикл (Ctrl+C для остановки)
while true; do echo "loop"; sleep 1; done

Скрипт 1 — testscript.sh

Создаёт иерархию директорий и файлов, упаковывает в архив, распаковывает в новый путь.

# testscript.sh

#!/bin/bash
#
ARHPATH=/tmp/Arh
EXTPATH=/opt/newfolder
DATE=`date '+%d-%m-%y'`
echo $DATE

for i in {1..5}
do
    mkdir -p Dir$i
    for j in {1..5}
    do
        date +'%H-%M-%S' > Dir$i/File-$j.txt
        sleep 5
    done
    ls Dir$i
done

tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* >> ArhList.txt
sleep 5
mkdir -p $EXTPATH
tar -xzf $ARHPATH/Arh-$DATE.tar.gz -C $EXTPATH
Пояснение строки с tar:
tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* — создать сжатый архив из всех Dir1..Dir5
>> ArhList.txt — вывод tar (-v) добавляется в файл ArhList.txt (verbose → файл)
tar -xzf ... -C $EXTPATH — извлечь в указанную директорию, сохраняя структуру

Скрипт 2 — pinger.sh

Запрашивает адрес и количество попыток, пингует и возвращает среднее время ответа.

# pinger.sh

#!/bin/bash
read -p "Введите адрес для пинга: " address
read -p "Введите количество запросов для проверки: " count
ping_result=$(ping -c "$count" "$address")
avg_ping=$(echo "$ping_result" | awk -F'/' '/^rtt/ { print $5 }')
echo "Среднее время пинга до $address составляет: $avg_ping мс"
Почему /^rtt/: вывод ping завершается строкой
rtt min/avg/max/mdev = 1.234/5.678/9.012/0.123 ms
awk ищет строку начинающуюся с rtt, делит по /, берёт 5-е поле (avg).

Скрипт 3 — md5check.sh

Вычисляет MD5-хэш каждого файла в указанной директории и сохраняет в текстовый файл.

# md5check.sh

#!/bin/bash
read -p "Enter path for control: " pathcheck
read -p "Enter path for result file: " pathresult
mkdir -p $pathresult
for var in $pathcheck/*
do
    echo "file name - " $var
    cd $pathresult
    md5sum $pathcheck/$var >> $pathcheck-md5sum.txt
done

Скрипт 4 — scriptmaker.sh

Создаёт новый bash-скрипт с шаблонным заголовком в указанном месте.

# scriptmaker.sh

#!/bin/bash
read -p "Enter path for script: " SCRIPTPATH
read -p "Enter name for your script: " NAME
mkdir -p $SCRIPTPATH
ls $SCRIPTPATH/$NAME 2>/dev/null
if [ $? -eq 0 ]
then
    echo "BAD NAME " $NAME "file exists"
else
    echo "Script will be created using path " $SCRIPTPATH/$NAME
    echo -e "#!/bin/bash\n#\n#Write the code here\n#\n" > $SCRIPTPATH/$NAME
    chmod +x $SCRIPTPATH/$NAME
    echo "DONE"
fi

Скрипт 5 — rename_ext.sh

Меняет расширения всех файлов в директории.

# rename_ext.sh

#!/bin/bash
read -p "Введите директорию (Enter = текущая): " directory
if [ -z "$directory" ]; then
    directory="."
fi
if [ ! -d "$directory" ]; then
    echo "Директория '$directory' не существует."
    exit 1
fi
read -p "Введите текущее расширение файлов: " current_extension
read -p "Введите новое расширение файлов: " new_extension
cd "$directory" || exit
for file in *.$current_extension; do
    if [ -e "$file" ]; then
        filename=$(basename "$file" ".$current_extension")
        mv "$file" "$filename.$new_extension"
        echo "Изменено: $file -> $filename.$new_extension"
    fi
done
echo "Готово."

Бесконечный цикл while true

Конструкция while true; do ...; done выполняется бесконечно. Для остановки нажмите Ctrl+C.

# infinite_loop_demo.sh

#!/bin/bash
# Бесконечный цикл — остановить Ctrl+C
counter=0
while true; do
    counter=$((counter + 1))
    echo "Итерация $counter — $(date +'%H:%M:%S')"
    sleep 1
done
Управление бесконечным циклом:
Ctrl+C — прервать скрипт (отправляет SIGINT)
Ctrl+Z — приостановить (отправить в фон), затем kill %1 для завершения
Всегда добавляйте sleep N в бесконечный цикл — иначе скрипт нагрузит CPU на 100%.