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

Материал из VAAL-WIKI
Перейти к: навигация, поиск
м (bash_task_Обновление)
м
 
(не показаны 2 промежуточные версии этого же участника)
Строка 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>
 
'''Используя цикл и оператор выбора написать скрипт, реализующий следующее''':
 
'''Используя цикл и оператор выбора написать скрипт, реализующий следующее''':
Строка 95: Строка 96:
 
<spoiler text="Вариант решения Задачи №3"><source lang="bash">
 
<spoiler text="Вариант решения Задачи №3"><source lang="bash">
 
#!/bin/env bash
 
#!/bin/env bash
 
 
reg_u=$(who |awk {'print $1'})
 
reg_u=$(who |awk {'print $1'})
 
xdate=$(date +%Y-%m-%d_%H-%M-%S)
 
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=$(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.|дня(-ь,-ей)|' \
+
upt_w=$(uptime -p |sed -e 's|up||g' -e 's|week.|недель(-я,-и)|' -e 's|day.|дня(-ь,-ей)|' -e 's|hour.|час(-а,-ов)|' -e's|minute.|минут(-ы)|')
      -e 's|hour.|час(-а,-ов)|' -e's|minute.|минут(-ы)|')
+
 
 
log_sys(){
 
log_sys(){
         logger -i -t "Check Sys Params" Дата и время: $xdate \| Зарегистрированные в системе пользователи: $reg_u \
+
         logger -i -t "CSys" Дата\/время: $xdate \| Зарегистрированные в системе пользователи: $reg_u \| Время работы системы: $1
\| Время работы системы: $1
+
 
}
 
}
  
if [ $(uptime|awk {'print $3'}) -gt 7 ]; then log_sys $upt_w; else log_sys $upt_w; fi
+
if [ $(uptime|awk {'print $3'}) -gt 7 ]; then log_sys "$upt_w"; else log_sys "$upt"; fi
 
+
log_sys
+
  
 
exit 0
 
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