Есть ли способ проверить несколько условий одновременно в BASH?

UL
На сайте с 04.08.2013
Offline
68
342

Как проверить является ли переменная не пустой и числом, при этом пока оба условия не удовлетворены ввод должен быть повторен? По отдельности - легко! А, если вместе проверять - дичь какая-то...

AU
На сайте с 03.09.2009
Offline
88
#1

Если я правильно понял ваш вопрос, то вам нужна конструкция вроде этой:

re='^[0-9]+$'

if ! [[ $your_number =~ $re ]] && [ !-z $your_number ]; then

echo "error: Not a number" >&2; exit 1

fi

При этом, "re" - ваше регулярное выражение, задающее целочисленные номера

"!-z" - проверяет переменную на пустое значение (восклицательный знак - отрицание, т.е. переменная должна быть не пустой)

Unix в вопросах и ответах https://unixhow.com (https://unixhow.com)
UL
На сайте с 04.08.2013
Offline
68
#2

adm.unix, я попробовал, в итоге примерно та же ошибка что и у меня: !-z: ожидается унарный оператор. Что ему нужно не очень понятно. Хотя проверка просто на пустую строку работает идеально. После && начинаются проблемы.

AU
На сайте с 03.09.2009
Offline
88
#3

Хм, а у меня отрабатывает нормально. А вывод ошибки можете показать? Какая у вас версия bash?

UL
На сайте с 04.08.2013
Offline
68
#4

adm.unix, 4.4.12.

Синтаксис подправил, ошибка исчезла, моя ошибка. Но все равно не работает. Не реагирует ни на какие ошибки, просто выполняет программу (при правильном вводе). Если убрать все перед &&, то на пустую строку проверят нормально.

Ваш код поместил в цикл:

#!/bin/bash

re='^[0-9]+$'

echo "ввести первое значение"

read var1

while [ -z $var1 ] && [[ $var1 =~ $re ]]; do

echo "error: Not a number" >&2; exit 1

read var1

done

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий