Nếu bạn muốn thử nghiệm một cách phù hợp POSIX, bạn có thể sử dụng một trong hai:
expr string : regex ## returns length of string if both sides match
hoặc
expr match string regex ## behaves the same
Ví dụ để kiểm tra nếu $myvar
là tất cả các chữ số:
[ $(expr "x$myvar" : "x[0-9]*$") -gt 0 ] && echo "all digits"
Lưu ý:'x'
được thêm vào trước biến và biểu thức để bảo vệ chống lại kiểm tra lỗi bỏ chuỗi trống. Để sử dụng length
được trả về bởi thử nghiệm, đừng quên trừ 1
đại diện cho 'x'
.
Trong if-then-else
hình thức, đây là một kịch bản ngắn mà kiểm tra xem số đầu tiên cho kịch bản chứa tất cả các chữ số:
#!/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
Kết quả ví dụ
$ sh testdigits.sh 265891
'265891' : all digits, length: 6 chars
$ sh testdigits.sh 265891t
'265891t' : contains characters other than [0-9]
Các bash biểu hiện thường xuyên kiểm tra [[ $var =~ ^[0-9]+$ ]]
là tốt, tôi sử dụng nó, nhưng nó là bashism (giới hạn trong vỏ bash). Nếu bạn quan tâm đến tính di động, kiểm tra POSIX sẽ hoạt động trong bất kỳ vỏ tuân thủ POSIX nào.
Nguồn
2015-08-20 01:28:45
'if [[$ MyVar = ~ [0-9]]]' có giống nhau không? – 3kstc
1.) '$ MyVar = ~ [0-9]' kiểm tra cho ít nhất một chữ số trong MyVar. Khi tôi hiểu mục tiêu của bạn, bạn muốn tìm hiểu xem đó có phải là _all_ chữ số hay không. Do đó hình thức đảo ngược của tôi. 2.) '[0-9]' được sử dụng để làm việc. Với unicode hiện đại, bạn không thể tin tưởng nó Đó là lý do tại sao tôi sử dụng '[: digit:]' – John1024