LINUX.ORG.RU

[SHELL] Проверить, что переменная это число

 


0

0

Здравствуйте!

Есть следующий кусок кода:

elif ! printf '%s\n' "$1" | grep '^[[:digit:]]\+$'; then
echo "Wrong number of test ($1). Should be a digit! Skipped." >&2
shift

Но при запуске в стандартном sh на SunOS вижу ругань:

./run_test.sh: !: not found

Как бы этот код сделать более портабельным?

(Пробовал grep -v, пробовал менять регулярное выражение на '^[^[:digit:]]\+$', но пока ничего не вышло..)

Заранее спасибо!

★★★★★

Читать ещё не научился, а уже писать лезешь...

mv ★★★★★
()

Будет ли работать на солярисе вот что?:

[ "$1" -ge 0 ] 2>/dev/null && echo "Yes, a number" || echo "No, not a number"

Если да, можно по вкусу добавить [ "$1" -ge 0 -o "$1" -le 0 ] -- тогда захватит и отрицательные числа тоже.

lodin ★★★★
()

elif expr "x$1" : 'x[0-9][0-9]*$' | grep '^0$' > /dev//null; then
  echo "Wrong number of test ($1). Should be a digit! Skipped." >&2

но хотя, тот код с ! он по стандарту написан.
  

dilmah ★★★★★
()
Ответ на: комментарий от lodin

обычно с помощью expr проверяют.

если expr 0 + "$1" выдаст ошибку, то не число.

Но тут проблема в том что нужна инверсия этого факта -- для инверсии нужно использовать ! -- а он не работает:)

dilmah ★★★★★
()

попробуй так:
test ! your_expression

bigbit ★★★★★
()

$ uname
SunOS

$ a=123
$ if echo $a | grep -v '^[0-9][0-9]*$' >/dev/null 2>&1 ; then echo OK; fi

$ a=kuku
$ if echo $a | grep -v '^[0-9][0-9]*$' >/dev/null 2>&1 ; then echo OK; fi
OK

sdio ★★★★★
()
Ответ на: комментарий от sdio

Спасибо! Замена регулярного выражения с '^[[:digit:]]\+$' на '^[0-9][0-9]*$' и использование ключа -v решили проблему.

php-coder ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.