Chính xác echo $ ((2 # $ 1)) làm gì?


53

Tập lệnh bash sau đây hiển thị số thập phân khi cho số nhị phân.

echo $((2#$1))

Tại sao chính xác?

Tôi hiểu đó $1là đầu vào. Có lẽ 2là cơ sở (nhị phân). Nhưng tôi không thể hiểu cú pháp được sử dụng.

Câu trả lời:


72

người đàn ông bash

   echo [-neE] [arg ...]
          Output  the  args,  separated  by spaces, followed by a newline.
          The return status is 0 unless a write error occurs.   If  -n  is
          specified, the trailing newline is suppressed.  If the -e option
          is given,  interpretation  of  the  following  backslash-escaped
          characters  is  enabled.

[...]

   Arithmetic Expansion
       Arithmetic  expansion allows the evaluation of an arithmetic expression
       and the substitution of the result.  The format for  arithmetic  expan‐
       sion is:

              $((expression))

[...]

   Constants with a leading 0 are interpreted as octal numbers.  A leading
   0x or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the  form
   [base#]n,  where the optional base is a decimal number between 2 and 64
   representing the arithmetic base, and n is a number in that  base.   If
   base#  is omitted, then base 10 is used.  When specifying n, the digits
   greater than 9 are represented by the lowercase letters, the  uppercase
   letters, @, and _, in that order.  If base is less than or equal to 36,
   lowercase and uppercase letters may be used interchangeably  to  repre‐
   sent numbers between 10 and 35.

66
-1 cho lời giải thích KHÔNG.
Tối đa

27
Tôi nghĩ nó được giải thích khá rõ
NanoPish

19
Trả lời đầy đủ một câu hỏi, ngay cả khi "chỉ" bằng cách quản lý tài liệu hiện có, không xứng đáng với tôi -1. Đặc biệt nếu tài liệu đó là trang chủ của bash.
YoungFrog

31
man bash | wccho biết trang man [GNU bash, phiên bản 3.2.57] là 4890 dòng, 37094 từ , 329778 ký tự. Câu trả lời này chỉ có 7 dòng, 176 từ , 1115 ký tự có liên quan. Tôi nghĩ rằng câu trả lời xứng đáng upvote của bạn. (cũng như nhận xét này ;-)
Bruno Bronosky

7
@MaxRied: -1 cho nhận xét của bạn để tìm kiếm lông tơ không cần thiết
Mehrdad

30

Từ tài liệu tại: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arith chữ số

Các hằng số có 0 đứng đầu được hiểu là các số bát phân. Một '0x' hoặc '0X' hàng đầu biểu thị hệ thập lục phân. Mặt khác, các số có dạng [cơ sở #] n, trong đó cơ sở tùy chọn là số thập phân từ 2 đến 64 đại diện cho cơ sở số học và n là một số trong cơ sở đó. Nếu cơ sở # bị bỏ qua, thì cơ sở 10 được sử dụng. Khi chỉ định n, các chữ số lớn hơn 9 được biểu thị bằng các chữ cái viết thường, các chữ cái in hoa, '@' và '_', theo thứ tự đó. Nếu cơ sở nhỏ hơn hoặc bằng 36, chữ cái viết thường và chữ hoa có thể được sử dụng thay thế cho nhau để thể hiện các số từ 10 đến 35.

Vì vậy, echo $((16#FF))đầu ra 255echo $((2#0110))đầu ra6


25

Câu trả lời của Ipor là tuyệt vời nhưng rất ít không đầy đủ. Phần được trích dẫn của trang bash man nói rằng cú pháp chỉ hoạt động cho các hằng và không phải là hằng số. Bạn nên hỏi làm thế nào điều này thực sự hoạt động![base#]n2#$1

SỰ BÀNH TRƯỚNG

    Mở rộng được thực hiện trên dòng lệnh sau khi nó đã được chia thành các từ. Có bảy loại mở rộng được thực hiện: mở rộng dấu ngoặc, mở rộng dấu ngã, mở rộng tham số và biến, thay thế lệnh, mở rộng số học, tách từ và mở rộng tên đường dẫn.

    Thứ tự mở rộng là: mở rộng cú đúp; mở rộng dấu ngã, mở rộng tham số và biến, mở rộng số học và thay thế lệnh (được thực hiện theo kiểu từ trái sang phải); tách từ; và mở rộng tên đường dẫn.

Về cơ bản Bash đang thực hiện thay thế đầu tiên, để cái $1đầu tiên được thay thế bằng giá trị của nó. Chỉ sau đó nó mới mở rộng số học, chỉ nhìn thấy một hằng số thích hợp.


Điều này có vẻ không cần thiết; OP nói, "Tôi hiểu đó $1là đầu vào."
Scott

8
+1 vì hiểu thứ tự mở rộng rất hữu ích để hiểu được nhiều biểu thức Bash khác nhau.
Anthony G - công lý cho Monica

1
Điều này có thể chỉ đơn giản là một nhận xét cho câu trả lời của Ipor.
chepner

1
@chepner Hãy cố gắng ép khối đó được định dạng tốt vào một nhận xét :-)
Alexander

1
"Lưu ý rằng tham số $1được mở rộng để tạo hằng số nguyên trước khi biểu thức số học được đánh giá. Xem gnu.org/software/bash/manual/bash.txt , phần 3.5"
chepner
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.