Не знаю правильного названия в данный момент.

Вопрос или проблема

В Linux в Bash в скрипте есть некоторые части, где у меня проблемы…

Запросите число в диапазоне от 4 до 999 :

while :; do
  read parts
  [[ $parts =~ ^[0-9]+$ ]] || { echo "введите корректное число"; continue; }
  if ((parts >= 4 && parts <= 999)); then
    break
  else
    echo "число вне диапазона, попробуйте снова"
    echo
  fi
done

Работает, но как записать введённое число непосредственно в файл temp/parts, а не в $parts?

while true ; do
    echo
    awk -v x=$(< temp/in_in_container_in_byte) -v n=$( temp/numbers_in_one_line

    cat temp/numbers_in_one_line |
                     tr " " "\n" |
                             rev |
         sed -E "s/(...)/\\1./g" |
                  sed "s/\.$//g" |
                             rev | xargs printf '| %15s  |\n'  > temp/numbers_line_by_line_right_dots

    cat temp/numbers_line_by_line_right_dots
    echo
    printf 'продолжать с y/Y - любая другая клавиша для нового предложения - strg+c для выхода'
    echo
    echo
    read answer
    if [ "$answer" != "${answer#[yY]}" ] ;then
#       echo да
        read -a numbers 

Работает неправильно. При нажатии y или Y полный скрипт завершается. Все строки после этого не обрабатываются

Как добавить реальную клавишу выхода E, а не выход с помощью strg+c?

Как добавить клавишу P для части, чтобы снова ввести другое число и запустить процесс заново?

Ответ или решение

Обработка ввода числа в Bash-скрипте на Linux с дополнительными функциями

В этом руководстве мы рассмотрим, как модифицировать ваш Bash-скрипт для корректной обработки ввода чисел и добавления функциональности для выхода и повторного ввода значений. Мы разберем основные части вашего кода и добавим нужные улучшения.

Шаг 1: Запись введенного числа в файл

Чтобы записать введенное число непосредственно в файл temp/parts, вам нужно немного изменить ваш цикл. Вместо сохранения значения в переменную $parts, используйте команду echo для записи его в файл. Вот обновленный фрагмент кода:

while :; do
  read parts
  [[ $parts =~ ^[0-9]+$ ]] || { echo "Введите корректное число"; continue; }
  if ((parts >= 4 && parts <= 999)); then
    echo "$parts" > temp/parts # Записываем значение в файл
    break
  else
    echo "Число вне диапазона, попробуйте снова"
    echo
  fi
done

Шаг 2: Добавление функционала для выхода и повторного ввода

Чтобы скрипт реагировал на ввод определенных символов, таких как E для выхода и P для повторного ввода числа, вам нужно внести изменения в вашу основную логику работы с ответами. Вместо простого чтения команды, добавьте проверку на эти клавиши. Вот как это может выглядеть:

while true; do
    echo
    awk -v x=$(<temp/in_in_container_in_byte) -v n=$(<temp/parts) 'BEGIN{srand(); while (--n) {$++NF = int(rand() * x / n); x -= $NF}; $++NF = x; print}' > temp/numbers_in_one_line

    cat temp/numbers_in_one_line | tr " " "\n" | rev | sed -E "s/(...)/\\1./g" | sed "s/\.$//g" | rev | xargs printf '| %15s  |\n' > temp/numbers_line_by_line_right_dots
    cat temp/numbers_line_by_line_right_dots
    echo
    echo "Нажмите y/Y для продолжения, p/P для повторного ввода числа, e/E для выхода:"

    read answer
    case "$answer" in
        [yY])
            read -a numbers < temp/numbers_in_one_line
            j=0
            for i in "${numbers[@]}"; do
                fallocate -l "$i" "temp/files/file$((++j))"
            done
            ;;
        [pP])
            echo "Введите новое число:"
            # Повторяем ввод числа, вызывая тот же цикл
            while :; do
                read parts
                [[ $parts =~ ^[0-9]+$ ]] || { echo "Введите корректное число"; continue; }
                if ((parts >= 4 && parts <= 999)); then
                    echo "$parts" > temp/parts # Записываем новое значение в файл
                    break
                else
                    echo "Число вне диапазона, попробуйте снова"
                    echo
                fi
            done
            continue
            ;;
        [eE])
            echo "Выход из скрипта."
            exit 0
            ;;
        *)
            echo "Неверный ввод. Пожалуйста, попробуйте снова."
            ;;
    esac
done

Заключение

Внесенные изменения усиливают функциональность вашего скрипта, обеспечивая более удобный и интуитивно понятный интерфейс взаимодействия пользователя. Теперь пользователи могут без проблем повторять ввод значений, выходить из программы и корректно обрабатывать вводимые данные. Такого рода улучшения помогают сделать ваш скрипт более универсальным и гибким для использования в различных сценариях.

Если у вас есть дополнительные вопросы или вам требуется помощь в других аспектах Bash-скриптов, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...