bash -e ออกเมื่อให้หรือ expr ประเมินเป็น 0


19

ฉันมี bash script ที่ตั้งค่า -e ดังนั้นสคริปต์จะออกจากสถานะการออกใด ๆ ! = 0

ฉันพยายามทำเลขคณิตพื้นฐานของเชลล์ที่กำหนดให้กับตัวแปรและบางครั้งนิพจน์มีค่าเท่ากับ 0 ซึ่งทำให้สถานะการออกของคำสั่ง let หรือ expr เป็น "1"

นี่คือตัวอย่าง:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

ผลลัพธ์คือ:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

คำถามของฉันคือสิ่งที่เป็นวิธีการเขียนสคริปต์ทุบตีสำนวนเพื่อให้สคริปต์ล้มเหลวในข้อผิดพลาดทางออกจริงและไม่ได้อยู่ในเลขคณิตพื้นฐานเท่ากับ 0 ฉันสามารถต่อท้ายการแสดงออกทั้งหมดที่มี:

A=`expr $C - $D`    || true

แต่ดูเหมือนว่าแฮ็ค

คำตอบ:


16

อย่าใช้exprเลขคณิต มันล้าสมัยมานานแล้ว: ตอนนี้เชลล์มีการคำนวณทางคณิตศาสตร์ด้วยการ$((…))สร้าง (POSIX) หรือด้วยletbuiltin (ksh / bash / zsh) หรือการ((…))สร้าง (ksh / bash / zsh)

letและ((…))ส่งคืน 1 (รหัสสถานะความล้มเหลว) หากนิพจน์ที่ประเมินล่าสุดคือ 0 เพื่อหลีกเลี่ยงปัญหานี้ที่ทำให้สคริปต์ของคุณออกภายใต้set -eให้จัดการนิพจน์สุดท้ายที่จะไม่ส่งคืน 0 ตัวอย่างเช่น

let "a = 2 - 2" 1
((a = 2 - 2, 1))

หรือใช้|| trueสำนวน:

((a = 2 - 2)) || true

อีกวิธีหนึ่งคือทำเลขคณิตภายใน$((…))ของคุณและกำหนดนอกของคุณ การมอบหมายจะส่งคืนสถานะของการทดแทนคำสั่งสุดท้ายในค่าหรือ 0 หากไม่มีการทดแทนคำสั่งดังนั้นคุณจะปลอดภัย สิ่งนี้มีประโยชน์เพิ่มเติมของการทำงานใน POSIX เชลล์ (เช่นเส้นประ)

a=$((2 - 2))

1

ใช้$(( $C - $D ))แทนเลขคณิตของคุณ มันมีประสิทธิภาพมากกว่าด้วย


สิ่งที่ทำให้มันมีประสิทธิภาพมากขึ้นกว่าการพูด(( A = $C - $D ))?
อธิการ

1

ผมมีปัญหาเดียวกัน TL; DR:

ถ้า ARG [of let] สุดท้ายประเมินเป็น 0 ให้ return 1 ให้ผลตอบแทน 0 มิฉะนั้น


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