คำสั่งทดสอบในยูนิกซ์จะไม่พิมพ์ผลลัพธ์


20

เมื่อฉันพิมพ์สิ่งนี้ในเทอร์มินัล

test 4 -lt 6

ฉันไม่ได้รับผลใด ๆ ทำไมไม่ ฉันต้องการที่ 0 หรือ 1


1
มันจะไม่ดีถ้า 'ทดสอบ' มีตัวเลือกในการส่งออกค่าทันทีหรือไม่ เพียงตัวเลือก นั่นคือทั้งหมดที่เราต้องการ
ทอดด์วอลตัน

คำตอบ:


15

คุณได้รับ 0 หรือ 1 ในรหัสทางออก

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

อัปเดต : ในการจัดเก็บ exitcode เพื่อใช้ในภายหลังเพียงกำหนดให้ตัวแปร:

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

1
มีวิธีในการไพพ์โค้ดทางออกหรือไม่?
indieman

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

2
รหัสทางออกถูกวางลงใน$?ตัวแปร - อย่างน้อยก็จนกว่ามันจะถูกเขียนทับโดยคำสั่งถัดไปที่คุณเรียกใช้
Shadur

1
PS: คุณสามารถใช้อาร์เรย์ที่จะได้รับผลของคำสั่งหลายในท่อ โดยจะเป็นผลมาจากการที่ผ่านมาคำสั่งในท่อถ้าตัวเลือกที่จะปิด (เริ่มต้น) $PIPESTATUS$?pipefail
l0b0

@indieman หากสิ่งที่คุณต้องการคือการทำอย่างอื่นตามสถานะการออกคุณไม่จำเป็นต้องบันทึกเลย - ใช้เพียงif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

อีกวิธีคือ

test 4 -lt 6 && echo 1 || echo 0

แต่ระวังในกรณีนั้น หากtestส่งคืนความสำเร็จและecho 1ล้มเหลวecho 0จะถูกดำเนินการ


2

หากคุณต้องการผลลัพธ์ของการเปรียบเทียบกับเอาท์มาตรฐานแทนที่จะเป็นรหัสออกคุณสามารถใช้expr(1)คำสั่ง:

$ expr 4 '<=' 6
1

สองสิ่งที่ควรทราบ:

  1. คุณอาจจะต้องพูดกับโอเปอเรเตอร์เพราะคนส่วนใหญ่ขัดแย้งกับเชลล์เมตาอักขระ
  2. testมูลค่าการส่งออกเป็นตรงข้ามของรหัสการส่งคืนสำหรับ testส่งคืน 0 สำหรับจริง (ซึ่งเป็นมาตรฐานสำหรับรหัสทางออก) แต่exprพิมพ์ 1 สำหรับจริง

1
3. มีความเป็นtestbuiltin เปลือกซึ่งเป็นเร็ว (ประมาณ 50 ครั้งในเครื่องของฉันกว่า) testและexprexecutables จากcoreutilsแพคเกจ
จัดการ

+1 สำหรับจุดที่สอง อาจได้รับข้อผิดพลาดที่น่าผิดหวังมากที่พบว่าคุณเลอะ
Emanuel Berg

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