Chciałbym przetestować, czy moja zmienna $var
jest rzeczywiście liczbą całkowitą, czy nie. Jak mogę to zrobić?Bash: Testowanie, czy zmienna jest liczbą całkowitą
Odpowiedz
echo your_variable_here | grep "^-\?[0-9]*$"
zwróci zmienną, jeśli jest liczbą całkowitą i nie zwraca niczego innego.
shopt -s extglob
case "$var" in
+([0-9])) echo "integer";
esac
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
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).
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]}" ]
(zauważyłem błąd w powyższym miejscu, w którym jest napisane, że 1a1 jest liczbą całkowitą: P ... jedną sekundę) –
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 –
Rozwiązanie ghostdog74 dało mi odpowiedź. Dodanie 'shopt -s extglob' wydaje mi się, że włącza pożądaną składnię wzoru :) –
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
Dokładny duplikat http://stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer/ 21884506 # 21884506 –
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
- 1. Sprawdzanie, czy zmienna jest liczbą całkowitą
- 2. Twig - Jak sprawdzić, czy zmienna jest liczbą/liczbą całkowitą
- 3. Jak sprawdzić, czy zmienna jest liczbą całkowitą lub łańcuchem?
- 4. Ustal, czy obiekt jest liczbą całkowitą
- 5. jak sprawdzić, czy znak jest liczbą całkowitą?
- 6. Python: Sprawdź, czy argument jest liczbą całkowitą
- 7. Sprawdzanie, czy podwójna wartość jest liczbą całkowitą - Swift
- 8. Java - Jak sprawdzić, czy podział jest liczbą całkowitą czy zmiennoprzecinkową?
- 9. Przyrost liczbą całkowitą
- 10. Jak sprawdzić, czy wartość jest liczbą całkowitą z plpgsql?
- 11. Sprawdź, czy ciąg znaków jest CAŁKOWITĄ liczbą liter w PHP
- 12. Jak sprawdzić, czy liczba zmiennoprzecinkowa jest liczbą całkowitą w haskell?
- 13. sprawdzanie, czy wartość pola tekstowego jest liczbą całkowitą w javascript
- 14. VB2010 Jak sprawdzić, czy liczba jest liczbą całkowitą
- 15. Sprawdź, czy wartość jest liczbą całkowitą w Sass
- 16. Jak wykryć, czy podana liczba jest liczbą całkowitą?
- 17. Jak sprawdzić, czy zmienna jest liczbą lub łańcuchem?
- 18. Bash porównanie całkowitą
- 19. Walidacja Laravel: różnica między liczbą a liczbą całkowitą?
- 20. php, dodać kończące zera, gdy liczba jest liczbą całkowitą
- 21. Dlaczego port jest ciągiem, a nie liczbą całkowitą?
- 22. Dlaczego liczba nie jest liczbą całkowitą bez znaku?
- 23. sprawdzanie poprawności ciągu jest nieujemną liczbą całkowitą w javascript
- 24. Szukam elegancki sposób do analizowania liczbą całkowitą
- 25. Niewyświetlanie liczb dziesiętnych, jeśli podwójne jest liczbą całkowitą?
- 26. Porównaj zmienną z liczbą całkowitą w powłoce?
- 27. Porównanie ostrzeżenia między wskaźnikiem a liczbą całkowitą
- 28. Jaki jest lepszy sposób sprawdzenia, czy ciąg jest liczbą całkowitą na iPhone?
- 29. Czy mój kod jest skuteczny w znalezieniu następnego palindromu z dodatnią liczbą całkowitą?
- 30. Jak sprawdzić, czy wartość jest liczbą całkowitą lub ciągiem w pliku jasmine.js?
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. –