✅ Решения заданий

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

⚡ Ключевые ответы

Экспресс-опрос 1: #!/bin/bash — shebang, указывает интерпретатор.

Экспресс-опрос 2: По умолчанию скрипт продолжается после ошибки. Остановить: set -e.

Ответы на экспресс-опрос

  1. Первая строка скрипта: #!/bin/bash — shebang. Указывает операционной системе, какой интерпретатор использовать для выполнения файла. Без неё ОС не знает, как исполнить скрипт (попытается использовать оболочку по умолчанию или выдаст ошибку).
  2. Поведение при ошибке: По умолчанию bash-скрипт продолжает выполнение после ошибочной команды. Если нужно остановиться при первой ошибке — добавьте в начало скрипта set -e.

Решение задания 1 — Скрипт-информатор

# script_Andrew.sh
#!/bin/bash
echo "Hello! This script shows system information."
echo "Current directory:"
pwd
echo "All processes:"
ps -ef
echo "Current date and time:"
date
echo "Files containing 'error' in /var/log/:"
grep -rn "error" /var/log/
echo "System info (/etc/os-release):"
cat /etc/os-release
echo "Line count in /etc/os-release:"
wc -l /etc/os-release
echo "Last 5 lines of /etc/os-release:"
tail -n 5 /etc/os-release
echo "Users info from /etc/passwd:"
awk -F ':' '{print "Username: " $1 ", Home: " $6}' /etc/passwd
echo "Script finished!"

Копирование в /tmp/: cp script_Andrew.sh /tmp/script_Andrew.sh

Решение задания 2 — Разбор скрипта создания файлов

Что делает скрипт строка за строкой:

DATE=`date '+%d-%m-%y'`  # Записать текущую дату (напр. 14-06-26) в переменную DATE
for i in {1..5}         # Цикл 5 раз
do
    date +'%H-%M-%S' > File-$i.txt  # Записать время в файл (напр. File-1.txt)
    sleep 5                          # Подождать 5 секунд (файлы будут с разным временем!)
done
mkdir -p $DATE           # Создать директорию с именем = дата
cp File*.txt $DATE       # Скопировать все File*.txt в эту директорию
for FILE in $DATE/*      # Цикл по всем файлам в директории
do
    cat $FILE            # Вывести содержимое каждого файла
done

Почему разное время? Между итерациями цикла стоит sleep 5 — пауза 5 секунд, поэтому каждый следующий файл записывает другое время.

Вариант с while:

# create_files_while.sh
#!/bin/bash
DATE=$(date '+%d-%m-%y')
COUNT=1
while [ $COUNT -le 5 ]
do
    date +'%H-%M-%S' > File-$COUNT.txt
    sleep 5
    ((COUNT++))
done
mkdir -p $DATE
cp File*.txt $DATE
for FILE in $DATE/*
do
    cat $FILE
done

Решение задания 3 — Проверка типа файла

# check_type.sh
#!/bin/bash
CURRENT_DIR=$(pwd)
echo "Checking files in: $CURRENT_DIR"
for FILE in *
do
    if [ -d "$FILE" ]; then
        echo "$FILE - directory"
    else
        echo "$FILE - file"
    fi
done
echo "Script finished!"

Решение задания 4 — Генерация файлов

# generate_files.sh
#!/bin/bash
if [ $# -eq 0 ]; then
    echo "Error: no arguments. Usage: $0 <num_files>"
    exit 1
fi
NUM_FILES=$1
mkdir -p generated_files
for ((i=1; i<=NUM_FILES; i++))
do
    FILE_NAME="generated_files/file_$i-$(date '+%Y-%m-%d').$RANDOM"
    RANDOM_TEXT=$(head /dev/urandom | head -c 100)
    echo "$RANDOM_TEXT" > "$FILE_NAME"
done
echo "Files created successfully!"

Запуск: chmod +x generate_files.sh && ./generate_files.sh 5