Xác nhận độ dài của một biến


27

Tôi đã xác minh độ dài của biến đọc (tập lệnh của tôi giới hạn ở năm ký tự được chèn), tôi nghĩ về một cái gì đó như thế này:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

Có một giải pháp "thanh lịch" hơn?


1
Kịch bản của bạn hoạt động chính xác trong POSIX tiêu chuẩn /bin/sh. Bạn nên xem xét việc thay đổi dòng shebang để #!/bin/shnó dễ di chuyển hơn và chạy trong môi trường không có bash. Thêm vào đó, /bin/shcó thể là một lớp vỏ nhẹ hơn như dấu gạch ngang không bị gánh nặng với các tính năng dành cho sử dụng tương tác.
Celada

@Celada, mặc dù đúng trong trường hợp này, dash's ${#string}sẽ cung cấp cho bạn độ dài trong số byte thay vì ký tự.
Stéphane Chazelas

Câu trả lời:


43

Thanh lịch hơn? Không

Ngắn hơn? Vâng :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

Và nếu bạn không gặp vấn đề gì trong việc giao dịch thanh lịch hơn vì ngắn hơn, bạn có thể có một tập lệnh với 2 dòng ít hơn:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

Bạn có thể sử dụng dấu ngoặc kép nếu bạn nghĩ rằng nó an toàn hơn. Giải thích tại đây .


3

Một lựa chọn thay thế tương thích với Bourne ( ${#string}là POSIX nhưng không phải Bourne (không phải là bạn có thể gặp phải vỏ Bourne ngày nay)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

Lưu ý rằng đối với cả hai ${#string}????, đó sẽ là số byte hoặc ký tự sẽ phụ thuộc vào trình bao. Nói chung (và được POSIX yêu cầu), đó là số lượng ký tự. Nhưng đối với một số shell như thế dashkhông nhận biết nhiều byte, nó sẽ là byte thay thế.

Với mksh, bạn cần set -o utf8-mode(theo địa phương UTF-8) để nó hiểu các ký tự nhiều byte:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8

lạc đề, nhưng là echo Too long khác biệt dưới cái mũ từecho 'Too long'
Steven Penny

Và, nếu bạn sẽ chỉ in khi "quá dài", tôi có thể thu gọn hơn nữa iftùy chọn của mình :)

2
@StevenPenny, echo Too longchuyển hai đối số ( Toolong) echoechođầu ra được phân tách bằng khoảng trắng (và theo sau là dòng mới), trong khi ởecho 'Too long' , chúng ta chuyển một Too longđối số echomà nó hiển thị theo dòng mới. Vì vậy, nó tương đương với chức năng.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.