2015-08-19 22 views
5

Làm cách nào để kiểm tra xem MyVar có chứa chỉ chữ số với tuyên bố if bằng BASH không. Bằng chữ số tôi đề cập đến 0-9.Cách kiểm tra xem chuỗi có chứa chữ số/ký tự số

ví dụ:

if [[ $MyVar does contain digits ]] <-- How can I check if MyVar is just contains numbers 
then 
do some maths with $MyVar 
else 
do a different thing 
fi 

Trả lời

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

Hoặc, nếu bạn thích hình thức if-then:

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

Trong thời xa xưa, chúng ta sẽ sử dụng [0-9]. Các hình thức như vậy không phải là unicode an toàn. Sự thay thế an toàn unicode hiện đại là [:digit:].

+0

'if [[$ MyVar = ~ [0-9]]]' có giống nhau không? – 3kstc

+1

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

7

Ở đây là:

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

It in ok nếu đối số đầu tiên chỉ chứa chữ số và no khác. Bạn có thể gọi nó với: ./yourFileName.sh inputValue

2

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.

Các vấn đề liên quan