2010-09-02 17 views

Odpowiedz

1

echo your_variable_here | grep "^-\?[0-9]*$" zwróci zmienną, jeśli jest liczbą całkowitą i nie zwraca niczego innego.

+2

Właściwie będzie to również wydrukować zmiennej stdout jeśli jest liczbą całkowitą. Naprawdę chcesz 'grep -q', który nie drukuje na standardowe wyjście, wychodzi tylko z 0 lub bez 0, jeśli jest dopasowanie. –

1
shopt -s extglob 
case "$var" in 
+([0-9])) echo "integer"; 
esac 
3
function is_int() { return $(test "[email protected]" -eq "[email protected]" > /dev/null 2>&1); } 

input=0.3 
input="a b c" 
input=" 3 " 
if $(is_int "${input}"); 
    then 
    echo "Integer: $[${input}]" 
else 
    echo "Not an integer: ${input}" 
fi 
1

ja potrzebuje czegoś, co zwróci true tylko dla dodatnich liczb całkowitych (i negatywnej na pusty ciąg). Zdecydowałem się na to:

test -n "$1" -a "$1" -ge 0 2>/dev/null

2>/dev/null jest tam, ponieważ badanie drukuje błąd (i zwraca 2) jeśli wejście (do -ge) nie analizuje jako liczba całkowita

życzę go może być krótszy, ale "test" nie wydaje się mieć "cichej" opcji i traktuje "" jako poprawną liczbę całkowitą (zero).

1

Można to zrobić:

shopt -s extglob 

if [ -z "${varname##+([0-9])}" ] 
then 
    echo "${varname} is an integer" 
else 
    echo "${varname} is not an integer" 
fi 

## łapczywie usuwa wyrażenie regularne od wartości zwracanej przez „nazwa_zmiennej”, więc jeśli var jest liczbą całkowitą prawdą jest, false jeśli nie.

Ma tę samą słabość co górna odpowiedź (używając "$ foo! = [! 0-9]"), że jeśli $ nazwa_zmiennej jest pusta, zwraca true. Nie wiem, czy to jest ważne. Jeśli nie zmienisz tylko testu na:

if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ] 
+0

(zauważyłem błąd w powyższym miejscu, w którym jest napisane, że 1a1 jest liczbą całkowitą: P ... jedną sekundę) –

+0

Nie mogę znaleźć sposobu "rozwinięcia nazwy pliku" w celu napisania "jednego lub więcej". Więc kiedy piszę [0-9] * dopasowuje liczbę całkowitą, a następnie dowolny znak, więc "1a1", "1a" lub "1blah" wszystkie pasują ... Z testem, jak w najczęściej zadawanych pytaniach, z którymi można się połączyć, można to zrobić w następujący sposób: 'if [[" $ nazwa_zmiennej "== + ([0-9])]]' ale "[['nie są standardowymi BASH i musi używać "właściwego" rozszerzenia wyrażenia regularnego, a nie rozszerzenia pliku. Czy ktoś wie, jak sprawić, by moje rozwiązanie działało? : P –

+0

Rozwiązanie ghostdog74 dało mi odpowiedź. Dodanie 'shopt -s extglob' wydaje mi się, że włącza pożądaną składnię wzoru :) –

0

Możesz wykonać operację * 2/2, która sprawdza zarówno, czy wartość jest numeryczna i czy jest liczbą całkowitą. Operacja zwraca 0 jeśli nie numeryczny

echo "Try with 10" 

var=10 
var1=`echo $((($var*2)/2))` 

if [ "$var" == "$var1" ]; then 
    echo '$var integer' 
else 
    echo '$var not integer' 
fi 

echo "Try with string" 

var=string 
var1=`echo $((($var*2)/2))` 

if [ "$var" == "$var1" ]; then 
    echo '$var integer' 
else 
    echo '$var not integer' 
fi 
+0

Dokładny duplikat http://stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer/ 21884506 # 21884506 –

10

Dopóki używasz bash wersji> = 3 można użyć wyrażenia regularnego:

[[ $a =~ ^-?[0-9]+$ ]] && echo integer 

Podczas this bash FAQ wspomina niespójności we wdrażaniu bash regex w różnych bashach 3.x (w przypadku cytowania wyrażenia regularnego lub nie), myślę, że w tym przypadku nie ma znaków, które wymagają cytowania w dowolnej wersji, więc jesteśmy bezpieczni. Przynajmniej to działa dla mnie:

  • 3.00.15 (1) -release (x86_64-RedHat-linux-gnu)
  • 3.2.48 (1) -release (x86_64-jabłko-darwin12)
  • 4.2.25 (1) -release (x86_64-pc-linux-gnu)
 
$ a="" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a=" " 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="a" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a='hello world!' 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a='hello world 42!' 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="42" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
integer 
$ a="42.1" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="-42" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
integer 
$ a="two" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
Powiązane problemy