✅ Решения — Завершение работы со скриптами

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

⚡ Ключевые строки решений

# Задача 1: архивирование
DATE=`date '+%d-%m-%y'`
tar -czvf $ARHPATH/Arh-$DATE.tar.gz Dir* >> ArhList.txt
tar -xzf $ARHPATH/Arh-$DATE.tar.gz -C $EXTPATH

# Задача 2: среднее время пинга
avg_ping=$(echo "$ping_result" | awk -F'/' '/^rtt/ { print $5 }')

# Задача 3: MD5-хэш
md5sum $pathcheck/$var >> $pathcheck-md5sum.txt

# Задача 4: создать скрипт
echo -e "#!/bin/bash\n#\n#Write the code here\n#\n" > $SCRIPTPATH/$NAME

# Задача 5: переименование
filename=$(basename "$file" ".$current_extension")
mv "$file" "$filename.$new_extension"

Решение 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

Разбор

  • ARHPATH и EXTPATH — переменные путей, легко изменить
  • DATE=`date '+%d-%m-%y'` — дата в формате 01-06-25
  • Вложенный цикл: внешний по Dir (1..5), внутренний по File (1..5)
  • date +'%H-%M-%S' > Dir$i/File-$j.txt — записывает текущее время в файл
  • tar -czvf ... Dir* — упаковывает все Dir1..Dir5 (glob)
  • >> ArhList.txt — вывод tar -v идёт в файл (накопление)
  • 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 мс"

Разбор

  • read -p "..." address — запросить адрес у пользователя
  • ping_result=$(ping -c "$count" "$address") — захватить весь вывод в переменную
  • awk -F'/' — разделитель /
  • /^rtt/ — найти строку начинающуюся с rtt
  • { print $5 } — вывести 5-е поле (avg после min/avg/max/mdev)

Решение 3 — md5check.sh

# 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

Разбор

  • Цикл по всем файлам в директории: for var in $pathcheck/*
  • md5sum $pathcheck/$var — вычислить хэш конкретного файла
  • >> $pathcheck-md5sum.txt — добавить результат к файлу с хэшами

Решение 4 — scriptmaker.sh

# 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

Разбор

  • ls $SCRIPTPATH/$NAME 2>/dev/null — тихая проверка существования
  • $? -eq 0 — ls вернул 0 (файл найден) → файл существует
  • echo -e "#!/bin/bash\n..."-e интерпретирует \n как перевод строки
  • chmod +x — назначить права исполнения новому скрипту

Решение 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 "Готово."

Разбор

  • [ -z "$directory" ] — строка пустая → использовать .
  • [ ! -d "$directory" ] — директория не существует → выход с ошибкой
  • for file in *.$current_extension — перебрать все файлы с нужным расширением
  • basename "$file" ".$current_extension" — имя файла без расширения
  • mv "$file" "$filename.$new_extension" — переименовать