Обмеження введення цілого числа


0

Я хочу зробити обмеження на введення read:

Термінальна оболонка;

read x
read y
echo $(($x+$y))

Я хочу зробити обмеження x, я хочу xбути -100 <= x <= 100.
Яку команду я вставляв раніше read x?

Відповіді:


2

$x- це рядок. Користувач може ввести що завгодно, це не обов'язково число. Перевірка вводу відбувається після введення. Ви повинні перевірити, чи це ціле число, і тоді ви можете зробити порівняння арифметики. Наприклад

read x
#validate if it is an integer
[[ "$x" =~ -?[0-9]+ ]] || echo error
#validate range (this is better done algebraically, not with string manipulation)
(( x >= -100 && x <= 100 )) || echo error
# carry on

до речі, вираз арифметичної оцінки в $(( ... ))може використовувати імена змінних, а не змінні розширення. Просто напишіть $(( x + y )).


Розчин для пуританів:

x=$(awk '/^-?[0-9]+\s*$/{ if ($1<=100 && $1>=-100){ print; exit; } } { exit 1; }') || echo error

У цьому випадку awkзчитується введення, а не оболонка, але ви також можете це зробити readі потім фільтрувати результат. Замість цього echo errorви можете використовувати вираз у циклі (який повторно запитує користувача на інший вхід) або просто під заставу exit 1.


Це, ймовірно, працює лише в декількох оболонках, і не використовує стандартний синтаксис.
mikeserv

Що ви маєте на увазі під стандартним синтаксисом? Оболонка, сумісна з Борном? Цей чистий, він працює в баш, який, ймовірно, охоплює більше 95% випадків, і, ймовірно, буде працювати для ОП. Якщо це не так, ми можемо додатково обговорити хитріші варіанти.
Оріон

Ні, я маю на увазі стандарт - вказано IEEE. Відповідно до POSIX.
mikeserv

0

Ви не можете цього зробити раніше read x - ще не прочитали. Як можна перевірити невідоме? Єдине рішення - отримати дані, а потім перевірити їх. Однак це можна зробити:

case ${#x}${x##?*[!0-9]*} in 
(?|[!1-4]*|4[!-]*|1-*|?[!-0-9]*) ! :;;
(*) echo "$(( x + y ))";;esac

Чи можу я оголосити $ x спочатку? (Під декларацією я маю на увазі, як c ++ та python). Так що я хочу, щоб цілий вхід знаходився в такому діапазоні .. У будь-якому разі, я не спробував ті, які ви обидва запропонували. Ще далеко від дому. Я скажу вам, чи працює він.
Fadh Nhz

@FadhNhz - ах - значить, ти питаєш про типи? Ну, загалом, ні. Деякі оболонки реалізувати вільні типи - kshі zshта навіть в меншій мірі, bash. Це не надійні типи - їх не вистачить для перевірки вхідних даних.
mikeserv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.