Вопрос или проблема
В 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-скриптов, не стесняйтесь обращаться за поддержкой.