2015-08-19 20 views

Odpowiedz

5
[[ $myvar =~ [^[:digit:]] ]] || echo All Digits 

Albo, jeśli chcesz formie if-then:

if [[ $myvar =~ [^[:digit:]] ]] 
then 
    echo Has some nondigits 
else 
    echo all digits 
fi 

W dawnych czasach, że użyliśmy [0-9]. Takie formy nie są bezpieczne dla Unicode. Nowoczesnym bezpiecznym zamiennikiem Unicode jest [:digit:].

+0

'jeśli [[$ MyVar = ~ [0-9]]]' jest takie samo? – 3kstc

+1

1.) '$ MyVar = ~ [0-9]' testuje co najmniej jedną cyfrę w MyVar. Ponieważ rozumiem twój cel, chcesz dowiedzieć się, czy jest to cyfra. Stąd moja odwrócona forma. 2.) '[0-9]' użyte do pracy. Przy nowoczesnym unicode nie można mu ufać. Dlatego użyłem '[: digit:]' – John1024

7

Oto ona:

#!/bin/bash 
if [[ $1 =~ ^[0-9]+$ ]] 
then 
    echo "ok" 
else 
    echo "no" 
fi 

Drukuje ok jeśli pierwszy argument zawiera tylko cyfry i no inaczej. Można nazwać go: ./yourFileName.sh inputValue

2

Jeśli chciałbyś przetestować w sposób zgodny z POSIX, można użyć albo:

expr string : regex  ## returns length of string if both sides match 

lub

expr match string regex ## behaves the same 

Na przykład, aby sprawdzić, czy $myvar jest wszystkie cyfry:

[ $(expr "x$myvar" : "x[0-9]*$") -gt 0 ] && echo "all digits" 

Uwaga:'x' dodano do zmiennej i wyrażenia w celu ochrony przed testem błędu wyrzucania pustych ciągów. Aby użyć zwracanej przez test wartości length, nie zapomnij odjąć 1, która reprezentuje 'x'.

W if-then-else postaci, o to krótki skrypt, który sprawdza, czy pierwszy argument skryptu zawiera wszystkie cyfry:

#!/bin/sh 

len=$(expr "x$1" : "x[0-9]*$") ## test returns length if $1 all digits 
let len=len-1     ## subtract 1 to compensate for 'x' 

if [ $len -gt 0 ]; then   ## test if $len -gt 0 - if so, all digits 
    printf "\n '%s' : all digits, length: %d chars\n" "$1" $len 
else 
    printf "\n '%s' : containes characters other than [0-9]\n" "$1" 
fi 

Przykâadowa testu

$ sh testdigits.sh 265891 

'265891' : all digits, length: 6 chars 

$ sh testdigits.sh 265891t 

'265891t' : contains characters other than [0-9] 

Bash wyrażenie regularne [[ $var =~ ^[0-9]+$ ]] jest w porządku, używam go, ale jest to bashism (ograniczone do powłoki basha). Jeśli chodzi o przenośność, test POSIX będzie działał w dowolnej powłoce zgodnej z POSIX.

Powiązane problemy