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.
'jeśli [[$ MyVar = ~ [0-9]]]' jest takie samo? – 3kstc
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