Score:5

ตัวดำเนินการเพิ่มไม่ทำงานบนตัวแปรหากตั้งค่าตัวแปรเป็น 0

ธง br

การเพิ่มตัวแปร วาร์ ทำงานใน bash เมื่ออยู่ในวงเล็บคู่เช่น (( var++ )). แต่ฉันพบว่ามันล้มเหลวหากตั้งค่าตัวแปรเป็น 0 ล่วงหน้าเช่น วาร์=0.

$a=0
$ ((a++)) && echo "คำสั่งสำเร็จ" || echo "คำสั่งล้มเหลว"
คำสั่งล้มเหลว

$a=1
$ ((a++)) && echo "คำสั่งสำเร็จ" || echo "คำสั่งล้มเหลว"
คำสั่งสำเร็จ

ใครช่วยอธิบายพฤติกรรมนี้ได้บ้าง

สิ่งแวดล้อม:

ฉันใช้ gnome-terminal บน Ubuntu Desktop 18.04.5 LTS

pLumo avatar
in flag
ฉันคิดว่าคุณไม่ควรใช้สถานะการออกของ `((` เพื่อให้รู้ว่าคำสั่งนั้นทำงานหรือไม่.. *>> "หากผลลัพธ์ของนิพจน์คือ 0 รหัสสถานะการออกที่ส่งคืนจะเป็น 1 หรือ âfalseâ ในขณะที่รหัสสถานะการออกที่ส่งคืนโดยนิพจน์ค่าที่ไม่ใช่ศูนย์จะเป็น 0 หรือ âจริงâ."* ([via](https://developpaper.com/functions-of-in-linux- เชลล์-2))
wjandrea avatar
cn flag
Sidenote: มีมากกว่าหนึ่งวิธีในการ [เพิ่มตัวแปรใน Bash](/q/385528/301745) อาจใช้สำนวนมากที่สุดคือการทำให้เป็นจำนวนเต็มอย่างชัดเจนก่อน: `declare -i a=0` แล้ว `a+=1`
ilkkachu avatar
co flag
@pLumo ไม่ใช่สถานะการออกที่ผิด แต่เป็นสมมติฐานของผู้ใช้ (ของคุณด้วย) มันทำงานเหมือนกับการระบุการเพิ่มภายหลังและเหมือนกับที่ทำในเช่น C. แม้ว่าคุณคิดถูกแล้วที่คุณไม่สามารถใช้สถานะการออกของ `(( .. ))` เพื่อดูว่า _worked_ หรือไม่ เนื่องจากข้อผิดพลาดทางไวยากรณ์ทำให้ออกด้วยสถานะ 1 (และไม่ใช่เช่น 2 เช่น `[` และ `[[` ทำ)
Saad Abdul Majid avatar
br flag
@pLumo รหัสสถานะการออกเป็นสิ่งที่น่ากังวลสำหรับฉันเพราะสคริปต์ใช้ `trap ... ERR` และบรรทัดนี้กระตุ้น ตอนนี้ฉันได้หลีกเลี่ยงสถานการณ์นี้โดยใช้การเพิ่มล่วงหน้าเนื่องจากค่าฐานของฉันคือ 0 สำหรับ `var' แต่วิธีนี้ใช้เฉพาะกับกรณีการใช้งานของฉัน บางทีฉันควรค้นหาวิธีเลี่ยงผ่าน `trap` สำหรับข้อความดังกล่าว/ที่เลือก
Score:10
ธง cn

ด้วยเครดิตจากที่นี่: https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

ค่าที่ส่งคืนของ (( expression )) ไม่ได้ระบุสถานะข้อผิดพลาด แต่จาก bash manpage:

((การแสดงออก)) นิพจน์ได้รับการประเมินตามกฎที่อธิบายไว้ด้านล่างภายใต้การประเมินทางเลขคณิต ถ้าค่าของนิพจน์คือ ไม่ใช่ศูนย์ สถานะการส่งคืนคือ 0; มิฉะนั้นสถานะการส่งคืนคือ 1 นี่เทียบเท่ากับปล่อยให้ "นิพจน์"

ใน ((a++))คุณกำลังเพิ่มโพสต์ คุณค่าของ เป็น 0 ดังนั้น 1 จะถูกส่งคืน หลังจากนั้นจะเพิ่มขึ้น

เปรียบเทียบ

$ ยกเลิกการตั้งค่า
$ ((a++)); echo รหัสทางออก: $? ก: $a
รหัสทางออก: 1 a: 1

เทียบกับ

$ ยกเลิกการตั้งค่า
$ ((++a)); echo รหัสทางออก: $? ก: $a
รหัสทางออก: 0 a: 1

เพิ่มขึ้นล่วงหน้าดังนั้น ได้กลายเป็น 1 และ 0 จะถูกส่งกลับ

wizzwizz4 avatar
de flag
ในทางเทคนิค การเพิ่มขึ้นจะเกิดขึ้นก่อนการกลับตัว อย่างไรก็ตาม ค่าที่ส่งคืนคือค่าที่ใช้ก่อนการเพิ่ม
Score:5
ธง jp

สิ่งนี้ใช้ได้สำหรับฉัน (ใน ทุบตี ในอูบุนตู)

$a=0
$ เสียงสะท้อน $((a++))
0
$ เสียงสะท้อน $((a++))
1
$ เสียงสะท้อน $((a++))
2
$ เสียงสะท้อน $((a++))
3
$เสียงสะท้อน $a
4

สังเกตความแตกต่างกับ

$a=0
$ เสียงสะท้อน $((++a))
1
$ เสียงสะท้อน $((++a))
2
$ เสียงสะท้อน $((++a))
3
$เสียงสะท้อน $a
3
pLumo avatar
in flag
ตรวจสอบ `echo $?`
sudodus avatar
jp flag
@pLumo, echo $((a++)) พิมพ์ก่อนอัพเดต, echo $((++a)) พิมพ์หลังอัพเดต
bac0n avatar
cn flag
การขยายเลขคณิตไม่แสดงสถานะการออกไม่เห็นการเชื่อมต่อ?

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา