Intereting Posts
Приоритеты реального времени в ОС реального времени Я побил apt-get и dpkg, пытаясь перекрещивать мою архитектуру Debian Как использовать awk или sed для преобразования csv в более читаемый формат scanimage не находит сканер, если не sudo'ed, но появляется со сканирующим сканером (Raspbian) Где я должен установить внешний жесткий диск? Результат вывода команды времени на переменную в сценарии bash как понять таблицу маршрутизации на клиенте OpenVPN Отказоустойчивый iSCSI root fs для Linux Перезапуск gnome-shell – программы KDE выглядят уродливыми Анализатор пакетов для перехвата и фильтрации входящего трафика перед любым клиентским приложением Как изменить рабочий каталог для сценария оболочки только вывод, когда первые столбцы одинаковы Как исправить iptables в ChromeOS? Использование sed / awk для извлечения первого «токена не-whitspace» в каждой строке Подключите USB-накопитель без разделов с помощью правил udev

BASH проверьте, является ли argv числом от 0 до 100

Мой настоящий сценарий

checkargv='^[0-9]+$' if ! [[ $1 =~ $checkargv ]] then echo "[!] How many times? $0 [number]" >&2 exit 1 fi for (( i=1;i<=$1;i++ )) do x=$[($RANDOM % 100) + 1] ./script.sh $x done 

мой argv $ 1 принимает прямо сейчас любое число от 0 до не имеет значения, как я могу сделать так, чтобы argv принимал числа только от 0 до 100

 if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then echo 'error (out of range)' >&2 exit 1 fi 

Это предполагает, что вещь в $1 на самом деле является целым числом. Вы можете проверить это заранее с

 case "$1" in ("" | *[!0-9]*) echo 'error (not a positive decimal integer number)' >&2 exit 1 esac 

Это вызовет exit если $1 содержит что-либо кроме десятичных цифр или является пустым.

Объединяя эти:

 case "$1" in ("" | *[!0-9]*) echo 'error (not a positive decimal integer number)' >&2 exit 1 ;; *) if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then echo 'error (out of range)' >&2 exit 1 fi esac 

Но выполнение одного за другим может выглядеть лучше:

 case "$1" in ("" | *[!0-9]*) echo 'error (not a positive decimal integer number)' >&2 exit 1 esac if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then echo 'error (out of range)' >&2 exit 1 fi 

Помните, что [ арифметические операторы всегда считают числа десятичными, даже если они начинаются с 0 , в то время как арифметические разложения оболочки в shellх POSIX будут считать числа, начинающиеся с 0, как восьмеричные (0100 – это 100 для [ , но 64 для $((...)) ).

Используйте арифметику вместо регулярных выражений:

 if ! (( num >= 0 && num <= 100 )) 

(Предполагается, что num является числовым. Если вам также необходимо проверить, что $ num является числовым, используйте также регулярное выражение.)