На данной странице представлены задачи и примерные решения на bash(актуально для RHEL 7.x/CentOS 7.x. В других случаях требуется проверка).
Задача №1
Используя цикл и оператор выбора написать скрипт, реализующий следующее:
- Выводит на экран(в терминал) меню с выбором, состоящим из двух пунктов "1)" "2)"
- При выборе "1)" выводит текст на экран(в терминал), содержащий только цифру 1
- При выборе "2)" выводит текст на экран(в терминал), содержащий только цифру 2
- При вводе любого другого символа, выводит на экран сообщение о неправильном вводе и просит повторить ввод.
При неправильном вводе цикл бесконечен, т.е. продолжается пока не будет введён нужный символ, а затем снова выводится меню выбора.
Модернизировать(№1) скрипт так, чтобы при неправильном вводе он выводил сообщение о выходе из скрипта через три секунды, после трёх секунд ожидания осуществляется выход из скрипта. Модернизировать(№2) скрипт добавив в него возможность прекращения работы в меню.
Вариант решения Задачи №1
#!/bin/env bash
#trap 'echo -e "\e[31mВот фиг тебе, а не прерывание\e[0m!"' 1 2 3 5 9 15
PS3='Введите значение: ' && echo
while :
do
#clear
options=("1" "2")
#options=("1" "2" "Завершение работы скрипта") — для модернизации №2
select opt in "${options[@]}"; do
case "$opt" in
1) echo 'Ввели ' "$opt"
break 1
;;
2) echo 'Ввели ' "$opt"
break 1
;;
# Для модернизации №2:
#'Завершение работы скрипта')
# echo "Завершили работу скрипта"
# exit
;;
*) echo 'Ввели неверный символ'
echo 'Повторите ввод'
break 1
#echo "Прекращаем работу скрипта через 3 секунды и осуществляем выход" — для модернизации №1
#sleep 3; exit 0 — для модернизации №1
;;
esac
#break
done
done
Задача №2
Написать скрипт реализующий следующее:
- Создать функцию, которая реализует вывод списка директорий в файл /tmp/dir_list.log. При этом в качестве входного аргумента для функции служит переданный скрипту параметр, представляющий из себя абсолютный путь.
- Создать функцию, которая будет считывать содержимое /tmp/dir_list.log и выводить на экран, а также копировать это содержимое в /tmp/dir_list.0.
- Вызов функций происходит с задержкой в 5 секунд.
- После успешной отработки скрипта и выхода из него файлы /tmp/dir_list.log и /tmp/dir_list.0 должны быть автоматически удалены. Для этого пункта запрещается прямой вызов `rm -rf` или $(rm -rf) перед завершением скрипта.
Подсказки для задачи №2
find . -maxdepth 1 -type d -printf '%f\n' — выводит все директории
find . -maxdepth 1 -type d| sed 's|./*||' | sed '/^$/d' — выводит все директории
find . -maxdepth 1 -type d -printf '%f\n'|sed '1d' — выводит все директории, кроме первой(в ней размещается ".")
ls -l|grep 'drwx'| awk '{print $9}'
for i in *; do [ -d "$i" ] && echo "$i";done
ls -d */ | sed 's|\/||g'
find * -maxdepth 0 -type d
Вариант решения Задачи №2
#!/bin/env bash
_find_dir=$1
log="/tmp/dir_list.log"
log_0="/tmp/dir_list.0"
trap "rm -rf $log $log_0" EXIT
find_dir (){
find $_find_dir -maxdepth 1 -type d -printf '%f\n'|sed '1d' >> $log
#find $_find_dir -maxdepth 0 -type d >> $log
#ls -l $_find_dir|grep 'drwx'| awk '{print $9}'>> $log
#cd $_find_dir;for i in *; do [ -d "$i" ] && echo "$i";done >> $log
}
cp_list (){
cat $log|tee -a $log_0
}
find_dir
sleep 5
cp_list
exit 0
Задача №3
Написать скрипт, который передаёт всю полученную в ходе своей работы информацию в системный журнал:
- Дату и время в формате ГГГГ-ММ-ДД_ЧЧ-ММ-СС.
- Список зарегистрировавшихся в системе,на текущий момент, пользователей.
- Время работы системы(вывод должен быть представлен кириллицей).
В консоли продемонстрировать вывод верно работающего скрипта.
Вариант решения Задачи №3
#!/bin/env bash
reg_u=$(who |awk {'print $1'})
xdate=$(date +%Y-%m-%d_%H-%M-%S)
upt=$(uptime -p |sed -e 's|up||g' -e 's|day.|дня(-ей)|' -e 's|hour.|час(-а,-ов)|' -e 's|minute.|минут(-ы)|')
upt_w=$(uptime -p |sed -e 's|up||g' -e 's|week.|недель(-я,-и)|' -e 's|day.|дня(-ь,-ей)|' -e 's|hour.|час(-а,-ов)|' -e's|minute.|минут(-ы)|')
log_sys(){
logger -i -t "CSys" Дата\/время: $xdate \| Зарегистрированные в системе пользователи: $reg_u \| Время работы системы: $1
}
if [ $(uptime|awk {'print $3'}) -gt 7 ]; then log_sys "$upt_w"; else log_sys "$upt"; fi
exit 0
Задача №4
Написать bash скрипт, который будет принимать в себя аргумент и, если значение, которое он принял будет чётное, то скрипт будет печатать только чётные значения до этого числа, если значение аргумента нечётное число, то печатать только нечётные значения до этого числа. В конце работы скрипт должен вывести сколько чётных или нечётных значений до этого числа.
Первый вариант решения Задачи №4
#!/bin/env bash
export chislo=$1
if [[ $chislo =~ [a-zA-Z] ]]; then
echo -e "\e[31mВвели не число\e[0m!"
elif [[ $chislo -eq 0 ]]; then
echo -e "Ввели число \e[31m0\e[0m"
echo -e "Количество \e[32mчётных\e[0m элементов в числе \e[31m0\e[0m равно \e[31m1\e[0m"
elif [[ ($chislo -gt 0) && ($(($chislo % 2)) -eq 0) ]]; then
even_chislo=$(seq 2 2 $chislo)
echo "Все чётные числа входящие в $chislo:"
for i in $even_chislo
do
echo $i
new_chislo=( "${new_chislo[@]}" "$i" )
done
echo -e "Количество \e[32mчётных\e[0m элементов в числе \e[32m$chislo\e[0m равно \e[31m${#new_chislo[@]}\e[0m"
elif [[ ($chislo -gt 0) && ($(($chislo % 2)) -eq 1) ]]; then
odd_chislo=$(seq 1 2 $chislo)
echo "Все нечётные числа входящие в $chislo:"
for i in $odd_chislo
do
echo $i
new_chislo=( "${new_chislo[@]}" "$i" )
done
echo -e "Количество \e[31mнечётных\e[0m элементов в числе \e[31m$chislo\e[0m равно \e[32m${#new_chislo[@]}\e[0m"
elif [[ ($chislo -lt 0) && ($(($(echo $chislo | sed 's|^-||g') % 2)) -eq 0) ]]; then
echo "Все чётные числа входящие в $chislo:"
chislo=$(echo $chislo | sed 's|^-||g')
even_chislo=$(seq 2 2 $chislo)
for i in $even_chislo
do
echo "-$i"
new_chislo=( "${new_chislo[@]}" "$i" )
done
echo -e "Количество отрицательных \e[32mчётных\e[0m элементов в числе \e[32m-$chislo\e[0m равно \e[31m${#new_chislo[@]}\e[0m"
elif [[ ($chislo -lt 0) && ($(($(echo $chislo | sed 's|^-||g') % 2)) -eq 1) ]]; then
echo "Все нечётные числа входящие в $chislo:"
chislo=$(echo $chislo | sed 's|^-||g')
odd_chislo=$(seq 1 2 $chislo)
#echo "Все нечётные числа входящие в $chislo:"
for i in $odd_chislo
do
echo "-$i"
new_chislo=( "${new_chislo[@]}" "$i" )
done
echo -e "Количество отрицательных \e[31mнечётных\e[0m элементов в числе \e[31m-$chislo\e[0m равно \e[32m${#new_chislo[@]}\e[0m"
fi
Второй вариант решения Задачи №4
#!/bin/env bash
num=$1
if [[ $num =~ - ]]; then
printf "Требуется передать в скрипт целое ПОЛОЖИТЕЛЬНОЕ число\n"
exit 1
elif [[ "`expr $num % 2`" == 0 ]]; then
for ((i=1; i<=$num; i++)); do
if [[ "`expr $i % 2`" == 0 ]]; then
echo "$i"
((chet+=1))
else
((nchet+=1))
fi
done
elif [[ "`expr $num % 2`" == 1 ]]; then
for ((i=1; i<=$num; i++)); do
if [[ "`expr $i % 2`" == 0 ]]; then
((chet+=1))
else
echo "$i"
((nchet+=1))
fi
done
else
printf "Требуется передать в скрипт целое ПОЛОЖИТЕЛЬНОЕ число\n"
exit 1
fi
printf "Количество четных чисел %d \nКоличество нечетных чисел %d \n" "$chet" "$nchet"
Третий вариант решения Задачи №4
#!/bin/env bash
num=$1
i=1
if [[ $num =~ - ]]; then
printf "Требуется передать в скрипт целое ПОЛОЖИТЕЛЬНОЕ число\n"
exit 1
elif [[ "`expr $num % 2`" == 0 ]]; then
while (($i<=$num)); do
if [[ "`expr $i % 2`" == 0 ]]; then
echo "$i"
((chet+=1))
else
((nchet+=1))
fi
((i+=1))
done
elif [[ "`expr $num % 2`" == 1 ]]; then
while (($i<=$num)); do
if [[ "`expr $i % 2`" == 0 ]]; then
((chet+=1))
else
echo "$i"
((nchet+=1))
fi
((i+=1))
done
else
printf "Требуется передать в скрипт целое ПОЛОЖИТЕЛЬНОЕ число\n"
exit 1
fi
printf "Количество четных чисел %d \nКоличесвто нечетных чисел %d \n" "$chet" "$nchet"