Відповіді:
$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
.
Ви не можете цього зробити раніше read x
- ще не прочитали. Як можна перевірити невідоме? Єдине рішення - отримати дані, а потім перевірити їх. Однак це можна зробити:
case ${#x}${x##?*[!0-9]*} in
(?|[!1-4]*|4[!-]*|1-*|?[!-0-9]*) ! :;;
(*) echo "$(( x + y ))";;esac
ksh
і zsh
та навіть в меншій мірі, bash
. Це не надійні типи - їх не вистачить для перевірки вхідних даних.