Bash-task — различия между версиями

Материал из VAAL-WIKI
Перейти к: навигация, поиск
м (bash_task_Обновление форматирования)
м
 
(не показаны 3 промежуточные версии этого же участника)
Строка 1: Строка 1:
 +
На данной странице представлены задачи  и примерные решения на bash(актуально для RHEL 7.x/CentOS 7.x. В других случаях требуется проверка).<br />
 
<p style="text-align:center"><span style="color:red">'''''Задача №1'''''</span></p>
 
<p style="text-align:center"><span style="color:red">'''''Задача №1'''''</span></p>
 
'''Используя цикл и оператор выбора написать скрипт, реализующий следующее''':
 
'''Используя цикл и оператор выбора написать скрипт, реализующий следующее''':
Строка 6: Строка 7:
 
* При вводе любого другого символа, выводит на экран сообщение о неправильном вводе  и  просит повторить ввод.
 
* При вводе любого другого символа, выводит на экран сообщение о неправильном вводе  и  просит повторить ввод.
 
При неправильном вводе цикл бесконечен, т.е. продолжается пока не будет введён нужный символ, а затем снова выводится меню выбора.
 
При неправильном вводе цикл бесконечен, т.е. продолжается пока не будет введён нужный символ, а затем снова выводится меню выбора.
'''Модернизировать''' скрипт так, чтобы при ''неправильном вводе'' он выводил сообщение о выходе из скрипта через ''три секунды'', после трёх секунд ожидания осуществляется выход из скрипта.                                                                                
+
'''Модернизировать'''(№1) скрипт так, чтобы при ''неправильном вводе'' он выводил сообщение о выходе из скрипта через ''три секунды'', после трёх секунд ожидания осуществляется выход из скрипта. '''Модернизировать'''(№2) скрипт добавив в него возможность прекращения работы в меню.
 
<p style="text-align:center">
 
<p style="text-align:center">
 
<spoiler text="Вариант решения Задачи №1"><source lang="bash">
 
<spoiler text="Вариант решения Задачи №1"><source lang="bash">
Строка 17: Строка 18:
 
         #clear
 
         #clear
 
         options=("1" "2")
 
         options=("1" "2")
 +
        #options=("1" "2" "Завершение работы скрипта") — для модернизации №2
 
         select opt in "${options[@]}"; do
 
         select opt in "${options[@]}"; do
 
         case "$opt" in
 
         case "$opt" in
Строка 24: Строка 26:
 
                 2) echo  'Ввели ' "$opt"
 
                 2) echo  'Ввели ' "$opt"
 
                     break 1
 
                     break 1
                 ;;                                                                          
+
                 ;;
 +
                # Для модернизации №2:
 +
                #'Завершение работы скрипта')
 +
                #  echo "Завершили работу скрипта"
 +
                #  exit
 +
                ;;                                                                       
 
                 *) echo 'Ввели неверный символ'
 
                 *) echo 'Ввели неверный символ'
 
                     echo 'Повторите ввод'
 
                     echo 'Повторите ввод'
 
                     break 1
 
                     break 1
                     #echo "Прекращаем работу скрипта через 3 секунды и осуществляем выход"
+
                     #echo "Прекращаем работу скрипта через 3 секунды и осуществляем выход" — для модернизации №1
                     #sleep 3; exit 0
+
                     #sleep 3; exit 0 — для модернизации №1
 
                 ;;
 
                 ;;
 
           esac
 
           esac
Строка 44: Строка 51:
 
* Вызов функций происходит с ''задержкой в 5 секунд''.
 
* Вызов функций происходит с ''задержкой в 5 секунд''.
 
* После успешной отработки скрипта и выхода из него файлы '''/tmp/dir_list.log''' и '''/tmp/dir_list.0''' должны быть автоматически удалены. Для этого пункта '''запрещается''' прямой вызов ''`rm -rf`'' или ''$(rm -rf)'' перед завершением скрипта.
 
* После успешной отработки скрипта и выхода из него файлы '''/tmp/dir_list.log''' и '''/tmp/dir_list.0''' должны быть автоматически удалены. Для этого пункта '''запрещается''' прямой вызов ''`rm -rf`'' или ''$(rm -rf)'' перед завершением скрипта.
 +
<spoiler text="Подсказки для задачи №2"><source lang="bash">
 +
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
 +
</spoiler>
 
<p style="text-align:center">
 
<p style="text-align:center">
 
<spoiler text="Вариант решения Задачи №2"><source lang="bash">
 
<spoiler text="Вариант решения Задачи №2"><source lang="bash">
Строка 68: Строка 84:
 
cp_list
 
cp_list
 
exit 0                                                                 
 
exit 0                                                                 
 +
</source>
 +
</spoiler>
 +
</p>
 +
<p style="text-align:center"><span style="color:red">'''''Задача №3'''''</span></p>
 +
'''Написать скрипт, который передаёт всю полученную в ходе своей работы информацию в системный журнал''':
 +
* ''Дату и время'' в формате ''ГГГГ-ММ-ДД_ЧЧ-ММ-СС''.
 +
* ''Список'' зарегистрировавшихся в системе,на ''текущий момент'', пользователей.
 +
* ''Время'' работы системы(вывод должен быть представлен ''кириллицей'').
 +
В консоли продемонстрировать вывод верно работающего скрипта.
 +
<p style="text-align:center">
 +
<spoiler text="Вариант решения Задачи №3"><source lang="bash">
 +
#!/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
 +
</source>
 +
</spoiler>
 +
</p>
 +
<p style="text-align:center"><span style="color:red">'''''Задача №4'''''</span></p>
 +
'''Написать bash скрипт, который будет принимать в себя аргумент и, если значение, которое он принял будет чётное, то скрипт будет печатать только чётные значения до этого числа, если значение аргумента нечётное число, то печатать только нечётные значения до этого числа. В конце работы скрипт должен вывести сколько чётных или нечётных значений до этого числа.'''
 +
<p style="text-align:center">
 +
<spoiler text="Первый вариант решения Задачи №4"><source lang="bash">
 +
#!/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
 +
</source>
 +
</spoiler>
 +
</p>
 +
 +
<p style="text-align:center">
 +
<spoiler text="Второй вариант решения Задачи №4"><source lang="bash">
 +
#!/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"
 +
</source>
 +
</spoiler>
 +
</p>
 +
 +
<p style="text-align:center">
 +
<spoiler text="Третий вариант решения Задачи №4"><source lang="bash">
 +
#!/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"
 
</source>
 
</source>
 
</spoiler>
 
</spoiler>
 
</p>
 
</p>

Текущая версия на 12:05, 12 марта 2018

На данной странице представлены задачи и примерные решения на bash(актуально для RHEL 7.x/CentOS 7.x. В других случаях требуется проверка).

Задача №1

Используя цикл и оператор выбора написать скрипт, реализующий следующее:

  • Выводит на экран(в терминал) меню с выбором, состоящим из двух пунктов "1)" "2)"
  • При выборе "1)" выводит текст на экран(в терминал), содержащий только цифру 1
  • При выборе "2)" выводит текст на экран(в терминал), содержащий только цифру 2
  • При вводе любого другого символа, выводит на экран сообщение о неправильном вводе и просит повторить ввод.

При неправильном вводе цикл бесконечен, т.е. продолжается пока не будет введён нужный символ, а затем снова выводится меню выбора. Модернизировать(№1) скрипт так, чтобы при неправильном вводе он выводил сообщение о выходе из скрипта через три секунды, после трёх секунд ожидания осуществляется выход из скрипта. Модернизировать(№2) скрипт добавив в него возможность прекращения работы в меню.

Вариант решения Задачи №1

Задача №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

Вариант решения Задачи №2

Задача №3

Написать скрипт, который передаёт всю полученную в ходе своей работы информацию в системный журнал:

  • Дату и время в формате ГГГГ-ММ-ДД_ЧЧ-ММ-СС.
  • Список зарегистрировавшихся в системе,на текущий момент, пользователей.
  • Время работы системы(вывод должен быть представлен кириллицей).

В консоли продемонстрировать вывод верно работающего скрипта.

Вариант решения Задачи №3

Задача №4

Написать bash скрипт, который будет принимать в себя аргумент и, если значение, которое он принял будет чётное, то скрипт будет печатать только чётные значения до этого числа, если значение аргумента нечётное число, то печатать только нечётные значения до этого числа. В конце работы скрипт должен вывести сколько чётных или нечётных значений до этого числа.

Первый вариант решения Задачи №4

Второй вариант решения Задачи №4

Третий вариант решения Задачи №4