Tôi đang cố gắng làm điều gì đó đủ phổ biến: Phân tích cú pháp đầu vào của người dùng trong một tập lệnh shell. Nếu người dùng cung cấp một số nguyên hợp lệ, tập lệnh sẽ thực hiện một việc, và nếu không hợp lệ, nó thực hiện một việc khác. Rắc rối là, tôi chưa tìm ra một cách dễ dàng (và hợp lý) để làm điều này - tôi không muốn phải tách nó ra từng char.
Tôi biết điều này phải dễ dàng nhưng tôi không biết làm thế nào. Tôi có thể làm điều đó bằng hàng chục ngôn ngữ, nhưng không phải BASH!
Trong nghiên cứu của mình, tôi tìm thấy điều này:
Biểu thức chính quy để kiểm tra xem một chuỗi có chứa một số thực hợp lệ trong cơ số 10 hay không
Và có một câu trả lời trong đó nói về regex, nhưng theo tôi biết, đó là một hàm có sẵn trong C (trong số những hàm khác). Tuy nhiên, nó có một câu trả lời tuyệt vời nên tôi đã thử nó với grep, nhưng grep không biết phải làm gì với nó. Tôi đã thử -P mà trên hộp của tôi có nghĩa là coi nó như một PERL regexp - nada. Dash E (-E) cũng không hoạt động. Và cả -F cũng vậy.
Nói rõ hơn, tôi đang thử một thứ như thế này, tìm kiếm bất kỳ đầu ra nào - từ đó, tôi sẽ hack kịch bản để tận dụng bất cứ thứ gì tôi có được. (IOW, tôi đã mong đợi rằng đầu vào không phù hợp sẽ không trả lại gì trong khi một dòng hợp lệ được lặp lại.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Ai đó vui lòng minh họa cách thực hiện điều này dễ dàng nhất?
Thành thật mà nói, đây là một thử nghiệm ngắn hạn, theo ý kiến của tôi. Nó phải có một lá cờ như thế này
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
tương thích cũtest
;[[
là điều mới của Bash, với nhiều thao tác hơn và các quy tắc trích dẫn khác nhau. Nếu bạn đã quyết định gắn bó với Bash, hãy tiếp tục[[
(nó thực sự đẹp hơn nhiều); nếu bạn cần khả năng chuyển sang các shell khác, hãy tránh[[
hoàn toàn.