เหตุใดการขยายตัวแปรโดยไม่มี $ ทำงานในนิพจน์


15
#!/bin/bash

VALUE=10

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

ด้วยความประหลาดใจของฉันผลลัพธ์นี้ "ใช่" [[ $VALUE -eq 10 ]]ผมจะได้คิดว่ามันจะต้องมี ฉันสแกนCONDITIONAL EXPRESSIONSส่วนของman bashแล้ว แต่ไม่พบสิ่งใดที่จะอธิบายพฤติกรรมนี้

คำตอบ:


11

[[[เป็นคำสงวนทุบตีจึงขยายตัวพิเศษกฎเช่นการขยายตัวทางคณิตศาสตร์ถูกนำมาใช้ไม่ได้เช่นในกรณีที่มี นอกจากนี้ยังมีผู้ประกอบการไบนารีเลขคณิต-eqถูกนำมาใช้ ดังนั้นเชลล์จะค้นหานิพจน์จำนวนเต็มและหากพบข้อความในรายการแรกมันจะพยายามขยายเป็นพารามิเตอร์ 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.

ตัวอย่างเช่น:

[[ hdjakshdka -eq fkshdfwuefy ]]

จะกลับมาจริงเสมอ

แต่อันนี้จะกลับข้อผิดพลาด

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

สามารถเรียกซ้ำได้ด้วย:

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

ทำไมการเป็นคำที่สงวนไว้หมายถึงการประเมินผลทางเลขคณิต ฉันไม่พบเอกสารที่ใดก็ได้
มิเคล


ฉันได้รวมการอ้างอิงจากman bashไปยังคำตอบเพื่อให้ชัดเจน
เร่ง

@Mikel มันไม่ได้เป็นความจริงโดยตรงว่า[[เป็นคำที่สงวนไว้ แต่เพราะสิ่งที่อยู่ภายใน[[ … ]]ไม่ใช่ไวยากรณ์คำสั่งธรรมดา แต่เป็นนิพจน์เงื่อนไข ในนิพจน์เงื่อนไขอาร์กิวเมนต์ของตัวดำเนินการทางคณิตศาสตร์เช่น-eqอาจมีการประเมินทางคณิตศาสตร์
Gilles 'หยุดความชั่วร้าย' ใน

ใช่. ฉันกำลังบอกว่าประโยคแรกให้ความคิดนั้นซึ่งทำให้เข้าใจผิด
Mikel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.