2013-08-04 45 views
5

Cố gắng xác minh rằng chuỗi chỉ có chữ thường, chữ hoa hoặc số trong đó.Bash cần kiểm tra chuỗi ký tự chữ số

if ! [[ "$TITLE" =~ ^[a-zA-Z0-9]+$ ]]; then echo "INVALID"; fi 

Suy nghĩ?

* CẬP NHẬT *

Biến TITLE hiện chỉ có chữ hoa chữ vì vậy nó phải vượt qua và không có gì nên được outputted. Tuy nhiên, nếu tôi thêm một ký tự đặc biệt vào TITLE, câu lệnh IF sẽ bắt được nó và lặp lại INVALID. Hiện tại nó không hoạt động. Nó luôn luôn lặp lại không hợp lệ. Tôi nghĩ rằng điều này là do tuyên bố regex của tôi là sai. Tôi nghĩ theo cách tôi viết nó, nó tìm kiếm một danh hiệu có cả ba cái trong đó.

Bash 4.2.25

Ý tưởng là, người dùng sẽ có thể thêm bất kỳ danh hiệu miễn là nó chỉ chứa chữ hoa, chữ thường hoặc số. Tất cả các nhân vật khác sẽ thất bại.

* CẬP NHẬT *

Nếu TITLE = ThisIsAValidTitle nó Echos không hợp lệ.

Nếu TITLE = ThisIs @@@@@@@?hl=viĐịnh danh nó cũng không hợp lệ.

* GIẢI PHÁP *

Weird, cũng nó bắt đầu làm việc khi tôi đơn giản hóa nó xuống này:

TEST="Valid0" 
if ! [[ "$TEST" =~ [^a-zA-Z0-9] ]]; then 
    echo "VALID" 
else 
    echo "INVALID" 
fi 

* REAL GIẢI PHÁP *

biến của tôi có khoảng trống trong nó ... DUH

Xin lỗi vì những kẻ rắc rối ...

* GIẢI PHÁP CUỐI CÙNG *

này chiếm không gian trong tiêu đề

if ! [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then 
    echo "VALID" 
else 
    echo "INVALID" 
fi 
+1

Kết quả là gì? Bạn đã mong chờ điều gì? –

+0

Biến TITLE hiện chỉ có văn bản chữ thường nên nó sẽ chuyển và không có kết quả nào được xuất. Tuy nhiên, nếu tôi thêm một ký tự đặc biệt vào TITLE, câu lệnh IF sẽ bắt được nó và lặp lại INVALID. Hiện tại nó không hoạt động. Nó luôn luôn lặp lại không hợp lệ. Tôi nghĩ rằng điều này là do tuyên bố regex của tôi là sai.Tôi nghĩ theo cách tôi viết nó, nó tìm kiếm một danh hiệu có cả ba cái trong đó. – Atomiklan

+0

Dường như làm việc tốt cho tôi. Bạn đang sử dụng phiên bản bash nào? –

Trả lời

11

tôi muốn đảo ngược logic. Thử nghiệm cho các ký tự không hợp lệ và echo một cảnh báo nếu ít nhất một hiện diện:

if [[ "$TITLE" =~ [^a-zA-Z0-9] ]]; then 
    echo "INVALID" 
fi 

Với những gì đã nói, kiểm tra ban đầu của bạn làm việc cho tôi, vì vậy bạn có thể cần phải cung cấp bối cảnh nhiều hơn (tức là một phần lớn của kịch bản của bạn) .

+0

Không thay đổi. Nếu TITLE = ThisIsAValidTitle thì nó không hợp lệ. Nếu TITLE = ThisIs @@@@@@@ InvalidTitle thì nó cũng không hợp lệ. – Atomiklan

+0

Bạn đang chạy trình bao này (tức là dòng chữ shebang của tập lệnh của bạn) là gì? –

+0

Tôi cung cấp cho bạn tín dụng một phần vì bạn đã giúp tôi thay đổi cú pháp xung quanh. Cảm ơn bạn – Atomiklan

0

câu trả lời được chỉ định là sai. Bởi vì nó không kiểm tra đến cuối chuỗi. nó cũng đảo ngược. như điều kiện nói: "nếu bắt đầu chuỗi là các ký tự hợp lệ thì hãy echo không hợp lệ"

[[ $TITLE =~ ^[a-zA-Z0-9_-]{3,20}$ ]] && ret="VALID" || ret="INVALID" 

echo $ret 
Các vấn đề liên quan