ทำไม a = 0; ปล่อยให้รหัสทางออกที่ส่งกลับ ++ 1?


16

ลองมัน:

$ a=0
$ let a++
$ echo $?
1 # Did the world just go mad?
$ echo $a
1 # Yes, it did.
$ let a++
$ echo $?
0 # We have normality.
$ echo $a
2

ตรงกันข้ามกับสิ่งนี้:

$ b=0
$ let b+=1
$ echo $?
0

และนี่ (จากSirex ):

$ c=0
$ let ++c
$ echo $?
0

เกิดขึ้นที่นี่คืออะไร?

$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)

คำตอบ:


19

จากhelp let:

Exit Status:
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise..

เนื่องจากvar++เป็นโพสต์ -increment ฉันเดาอาร์กิวเมนต์ที่ผ่านมาไม่ประเมินให้เป็นศูนย์ เมตตา ...

ภาพประกอบที่ชัดเจนกว่า:

$ let x=-1 ; echo x=$x \$?=$?
x=-1 $?=0
$ let x=0 ; echo x=$x \$?=$?
x=0 $?=1
$ let x=1 ; echo x=$x \$?=$?
x=1 $?=0
$ let x=2 ; echo x=$x \$?=$?
x=2 $?=0

1
จุดที่ดี ฉันคาดเดา ++ a จะทำหน้าที่เหมือนกับ + = 1 แล้ว
Sirex

ใช่ว่าใช้งานได้
l0b0

1
สำหรับบันทึกพฤติกรรมนี้จะเหมือนกันในอินสแตนซ์ ksh88 ของฉัน (แม้ว่าการโพสต์เพิ่มขึ้นlet a++ไม่ทำงาน)
rahmu

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