Hiểu `echo $ ((0x63))`


18

Tôi đã tìm kiếm một cách để chuyển đổi thập lục phân thông qua dòng lệnh và thấy có một phương pháp rất dễ dàng echo $((0x63)).

Nó hoạt động rất tốt nhưng tôi hơi bối rối về những gì đang xảy ra ở đây.

Tôi biết $(...)bình thường là một vỏ con, trong đó các nội dung được đánh giá trước lệnh ngoài.

Nó vẫn là một vỏ phụ trong tình huống này? Tôi nghĩ không phải như vậy có nghĩa là lớp vỏ phụ chỉ đang đánh giá (0x63)đó không phải là một lệnh.

Ai đó có thể phá vỡ lệnh cho tôi?

Câu trả lời:


27

$(...)là một sự thay thế lệnh (không chỉ là một nhánh con), mà $((...))là một sự mở rộng số học.

Khi bạn sử dụng $((...)), ...sẽ được hiểu là một biểu thức số học. Điều này có nghĩa, trong số những thứ khác, một chuỗi thập lục phân sẽ được hiểu là một số và được chuyển đổi thành số thập phân. Toàn bộ biểu thức sau đó sẽ được thay thế bằng giá trị số mà biểu thức ước tính.

Giống như mở rộng tham số và thay thế lệnh, $((...))nên được trích dẫn để không bị ảnh hưởng bởi việc tách từ và tên tệp của shell.

echo "$(( 0x63 ))"

Là một lưu ý phụ, các biến xảy ra trong biểu thức số học không cần $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78

2
Cũng lưu ý rằng vì $((...))xung đột với thay thế lệnh, người ta phải nhớ viết echo "$( (echo x; echo y) | tr xy yx)"thay vì echo "$((echo x; echo y) | tr xy yx)"(mặc dù một số shell vẫn sẽ chấp nhận cái sau, YMMV).
Stéphane Chazelas

@ StéphaneChazelas Và làm thế nào để bạn tạo $(( ))ra sản phẩm đầu ra bị ảnh hưởng bởi việc tách từ hoặc toàn cầu?
Hauke Laging

3
@HaukeLaging , IFS=9; echo $((0x63)). Xem thêm Ý nghĩa bảo mật của việc quên trích dẫn một biến trong bash / POSIX shell ( What about [ $# -gt 1 ]phần)
Stéphane Chazelas

3

Đây không phải là một subshell, nhưng đánh giá số học. Từ man bash:

((biểu hiện))

Biểu thức được đánh giá theo các quy tắc được mô tả dưới đây trong ĐÁNH GIÁ ARITHMETIC . Nếu giá trị của biểu thức là khác không, trạng thái trả về là 0; mặt khác, trạng thái trả về là 1. Điều này hoàn toàn tương đương với "biểu thức".


9
((...))không hoàn toàn giống như $((...)). Cả hai đều đánh giá số học, nhưng cái sau được thay thế bằng giá trị kết quả dưới dạng chuỗi.
Kusalananda
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.