Tại sao mở rộng biến mà không có $ làm việc trong các biểu thức?


15
#!/bin/bash

VALUE=10

if [[ VALUE -eq 10 ]]
then
    echo "Yes"
fi

Thật ngạc nhiên, điều này xuất ra "Có". Tôi đã mong đợi nó sẽ yêu cầu [[ $VALUE -eq 10 ]]. Tôi đã quét CONDITIONAL EXPRESSIONSphần này man bash, nhưng tôi không tìm thấy gì để giải thích hành vi này.

Câu trả lời:


11

[[là từ dành riêng bash, do đó các quy tắc mở rộng đặc biệt như mở rộng số học được áp dụng, không giống như trong trường hợp với [. Ngoài ra toán tử nhị phân số học -eqđược sử dụng. Do đó, shell tìm biểu thức nguyên và nếu tìm thấy văn bản ở mục đầu tiên, nó sẽ cố gắng mở rộng nó dưới dạng tham số. Nó được gọi là mở rộng số học và có mặt trong man bash.

RESERVED WORDS
       Reserved words are words that have a special meaning to the shell.  
       The following words are recognized as reserved 
       
       [[ ]]

[[ expression ]]
       Return  a  status  of 0 or 1 depending on the evaluation of 
       the conditional expression expression.  Expressions are 
       composed of the primaries described below under CONDITIONAL 
       EXPRESSIONS.  Word splitting and pathname expansion are not 
       performed on the words between the  [[  and  ]];  tilde 
       expansion, parameter and variable expansion, >>>_arithmetic 
       expansion_<<<, command substitution, process substitution, and 
       quote removal are performed.  

Arithmetic Expansion
       
       The evaluation is performed according to the rules listed below 
       under ARITHMETIC EVALUATION.

ARITHMETIC EVALUATION
       
       Within an expression, shell variables may also be referenced 
       by name without using the parameter expansion syntax.

Ví dụ:

[[ hdjakshdka -eq fkshdfwuefy ]]

sẽ luôn luôn trở lại đúng

Nhưng cái này sẽ trả về lỗi

$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")

Ngoài ra đệ quy có sẵn:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")

Tại sao là một từ dành riêng có nghĩa là nó đánh giá số học? Tôi không thể tìm thấy tài liệu đó ở bất cứ đâu
Mikel


Tôi đã bao gồm trích dẫn từ man bashcâu trả lời của tôi để làm cho nó rõ ràng.
vội vàng

@Mikel Đây không phải [[là một từ dành riêng, mà bởi vì những gì bên trong [[ … ]]không phải là cú pháp lệnh thông thường, mà là một biểu thức có điều kiện. Trong một biểu thức có điều kiện, các đối số cho các toán tử số học như -eqlà đối tượng để đánh giá số học.
Gilles 'SO- ngừng trở nên xấu xa'

Đúng. Tôi đã nói câu đầu tiên đưa ra ý tưởng đó, đó là sự hiểu lầm
Mikel
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.