Làm cách nào để ngăn Bash giải thích mã bát phân thay vì số nguyên?


13

Tôi đang viết một kịch bản RSS Tử vi như một phần giới thiệu cho dự án Unix / Linux và gặp phải một vấn đề mà Giáo sư của tôi không thể khắc phục trong thời gian tôi có thể ở lại sau giờ học. Vì tôi không thể tìm ra cách sử dụng ngày thực tế như những gì cần kiểm tra, tôi nghĩ rằng tôi đã thử số học cơ bản bằng cách nhập dữ liệu của người dùng là số chuẩn ở định dạng MMDD. Theo ông, kịch bản dường như đang đọc đầu vào dưới dạng mã bát phân thay vì số nguyên. Đây là một mẫu của kịch bản:

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit

Đây là xương trần, tôi lấy ra phần RSS. "olddate" là đầu vào dự kiến ​​từ dấu nhắc đọc của tôi. Trong khi 1121 đến 1131, 1200 đến 1222 và 0100 đến 0120 hoạt động, không có gì từ 1221 đến 1232. Anh ta cho rằng đó là vấn đề kể từ khi đặt 113 mà không có số 0 đứng đầu làm việc cho Ma Kết. Tôi cũng vừa gặp phải một vấn đề trong đó 0323 được cho là cung cấp cho tôi Bạch Dương (-gt 0320 && -lt 0332) đã đưa cho tôi Bảo Bình (có ngày là -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) cũng như 0417 không hoạt động (đó là phạm vi ngày khác cho Bạch Dương, -gt 0400 && -lt 0420).

Tôi phải làm gì để BASH diễn giải đầu vào là số thực? Anh ấy đã thử thay đổi lời nhắc đọc để mong đợi "userdate" làm đầu vào và sau đó thêm

olddate=`printf '%d\n' "$userdate"`

nhưng điều đó đã không làm việc. Cảm ơn trước cho bất cứ ai có thể giúp tôi về điều này!


Không thể sao chép trên bash 4.4.12.
Ignacio Vazquez-Abrams

1
$ olddate là một chuỗi, không phải là một số, vì vậy hãy sử dụng so sánh chuỗi và tránh toàn bộ mớ hỗn độn.
Stephen Harris

2
@StephenHarris: Các giá trị ở bên phải của các toán tử cũng vậy. Đó là lý do tại sao testcó toán tử số rõ ràng.
Ignacio Vazquez-Abrams

Một điều cần lưu ý, nhưng không liên quan đến câu hỏi cốt lõi, đó là cung hoàng đạo của bạn cũng phụ thuộc một phần vào năm bạn sinh, nếu ngày và tháng sinh của bạn gần với sự chuyển đổi giữa 2 cung hoàng đạo. Dấu hiệu hoàng đạo của bạn dựa trên phần 1/12 của bầu trời vào lúc bạn sinh ra, nhưng vì số ngày trong một năm không phải là một số nguyên và cũng không chia hết cho 12, nên có một số biến đổi từ năm này sang năm khác. Biến thể này quá phức tạp để thực sự bắt được ở những cây khác, nhưng đó chỉ là một điều có thể tốt để biết.
Nzall

Câu trả lời:


28

Bạn có thể buộc chuyển đổi một số thành một cơ sở cụ thể trong bash như vậy:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

Nói chung định dạng là $((base#value)).

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.