2012-04-24 3 views
0

Я нашел интересный скрипт Bash, который будет проверять, является ли переменная числовой/целочисленной. Мне это нравится, но я не понимаю, почему «0» не распознается как число? Я не могу спросить автора, привет/ши анонимно.Bash - почему «0» не распознается как номер?

#!/bin/bash 

n="$1" 

echo "Test numeric '$n' " 
if ((n)) 2>/dev/null; then 
n=$((n)) 
echo "Yes: $n" 
else 
echo "No: $n" 
fi 

Спасибо!

ОБНОВЛЕНИЕ - 27 апр 2012.

Это мой окончательный код (короткая версия):

#!/bin/bash 

ANSWER=0 
DEFAULT=5 
INDEX=86 

read -p 'Not choosing/Wrong typing is equivalent to default (#5): ' ANSWER; 

shopt -s extglob 
if [[ $ANSWER == ?(-)+([0-9]) ]] 
    then ANSWER=$((ANSWER)); 
    else ANSWER=$DEFAULT; 
fi 

if [ $ANSWER -lt 1 ] || [ $ANSWER -gt $INDEX ] 
    then ANSWER=$DEFAULT; 
fi 
+0

возможно дубликат [BASH: Тест является ли строка действуют как целое] (HTTP: //stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer) –

ответ

1

использование pattern matching для теста:

if [[ $n == *[^0-9]* ]]; then echo "not numeric"; else echo numeric; fi 

Это не будет соответствовать отрицательное число, хотя, и это будет ложно соответствовать пустой как числовой. Для более точного рисунка, включите расширенную подстановку командного интерпретатора:

shopt -s extglob 
if [[ $n == ?(-)+([0-9]) ]]; then echo numeric; else echo "not numeric"; fi 

И чтобы соответствовать дробному числу

[[ $n == @(?(-)+([0-9])?(.*(0-9))|?(-)*([0-9]).+([0-9])) ]] 
+0

Спасибо, Гленн! – Iurie

4

Это не проверить, если это числовое/целое число. Он проверяет, соответствует ли n истинному или ложному, если 0 - false, else (числовая или другая символьная строка), это правда.

+0

Спасибо, Чарльз! – Iurie

Смежные вопросы