Bash: double เท่ากับ vs -eq


47

ฉันทำการเปรียบเทียบจำนวนเต็มในทุบตี (พยายามดูว่าผู้ใช้ทำงานเป็น root) และฉันพบสองวิธีแตกต่างกัน:

สองเท่ากับ

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

ผมเข้าใจว่าไม่มี> = หรือ <= ในทุบตีเพียง -GE และเลอจึงเป็นเหตุผลว่าทำไมมี==ถ้ามี-eq?

มีความแตกต่างในวิธีการเปรียบเทียบทั้งสองด้านหรือไม่?


3
หมายเหตุช่องว่างที่ในวงเล็บจำเป็นต้องใช้: ไม่[ $UID -eq 0 ] [ $UID -eq 0]
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


50

==เป็นbashนามแฝงเฉพาะสำหรับ=ซึ่งดำเนินการเปรียบเทียบสตริง (ศัพท์) แทนการ-eqเปรียบเทียบตัวเลข (ย้อนกลับจาก Perl: ตัวดำเนินการคำศัพท์เป็นตัวเลขสัญลักษณ์ที่เป็นคำศัพท์)


นั่นหมายความว่าถ้าทั้งสองข้างเป็นจำนวนเต็มมันจะแปลงทั้งสองข้างเป็นสตริงแล้วเปรียบเทียบมันได้หรือไม่
beatgammit

5
แม่นยำกว่าเป็นอีกวิธีหนึ่ง: ทุกสิ่งเป็นสตริง-eqบอกbashให้ตีความสตริงเป็นจำนวนเต็ม (สร้าง0โดยไม่มีการเตือนหากสตริงไม่ใช่ตัวเลข)
geekosaur

11
@tjameson เพื่อให้ตัวอย่าง: แต่[ 01 -eq 1 ] [ 01 != 1 ]
Gilles 'หยุดความชั่วร้าย'

3
โปรดทราบว่าในขณะที่==เป็น[ผู้ประกอบการเป็นที่ไม่ได้มาตรฐานและไม่ควรนำมาใช้ก็ไม่ได้ทุบตีเฉพาะ มันได้รับการแนะนำโดย ksh และได้รับการสนับสนุนโดย zsh (แม้ว่าจะ=ต้องมีการเสนอราคาครั้งแรก), yash และ[ยูทิลิตี้GNU (และยูทิลิตี้ใด ๆ ที่นำมาใช้เป็นสคริปต์ ksh ในบางระบบ) อย่างน้อย
Stéphane Chazelas

@geekosaur ฉันได้รับการเตือนจากทุบตี v4.3.42 ถ้าสตริงของฉันไม่ได้เป็นตัวเลข: $ if [ "hello" -eq 0 ]; then echo true; fi ทุบตี: [: สวัสดี: นิพจน์จำนวนเต็มคาด
แอนดรูเบนบริดจ์

13

เพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบของ bollovan ...

ไม่มีตัวดำเนินการ>=หรือ<=เปรียบเทียบสำหรับสตริง แต่คุณสามารถใช้มันกับ((...))คำสั่งเลขคณิตเพื่อเปรียบเทียบจำนวนเต็ม

นอกจากนี้คุณยังสามารถใช้ประกอบการเปรียบเทียบสตริงอื่น ๆ ( ==, !=, <, >แต่ไม่ได้=) ((...))เพื่อเปรียบเทียบจำนวนเต็มถ้าคุณใช้พวกเขาภายใน

ตัวอย่าง

  • ทั้งสอง[[ 01 -eq 1 ]]และ(( 01 == 1 ))ทำการเปรียบเทียบจำนวนเต็ม ทั้งสองเป็นจริง
  • ทั้งสอง[[ 01 == 1 ]]และ[ 01 = 1 ]ทำการเปรียบเทียบสตริง ทั้งคู่เป็นเท็จ
  • ทั้งสอง(( 01 -eq 1 ))และ(( 01 = 1 ))จะส่งคืนข้อผิดพลาด

หมายเหตุ: ไวยากรณ์วงเล็บคู่[[...]]และไวยากรณ์วงเล็บคู่((...))ไม่ได้รับการสนับสนุนโดยเชลล์ทั้งหมด


1
โปรดทราบว่า (ยกเว้นสำหรับmksh/ zsh(ยกเว้นในโหมด POSIX (แม้ว่าไม่ใช่คุณลักษณะ POSIX))) (( 010 == 10 ))จะส่งคืนค่าเท็จเนื่องจาก010จะถือว่าเป็นเลขฐานแปด (8 เป็นทศนิยม)
Stéphane Chazelas

ทราบว่าขณะที่ส่วนใหญ่test/ [การใช้งานที่ไม่ได้>=/ <=ผู้ประกอบการ ( yash's [มีแม้ว่า) exprมีผู้ประกอบการดังกล่าวแม้ว่ามันจะทำเปรียบเทียบเลขคณิตถ้าขัดแย้งจะรับรู้เป็นตัวเลข ( expr 01 '>=' 1ผลตอบแทนจริงexpr X01 '>=' X1ผลตอบแทนเท็จ)
Stéphane Chazelas

7

หากคุณต้องการทำการเปรียบเทียบจำนวนเต็มคุณจะใช้ (()) ซึ่งคุณสามารถใช้> = ฯลฯ

ตัวอย่าง:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi

หรือ(( UID == 0 ))หรือ(( ! UID ))สำหรับเรื่องที่ โปรดทราบว่า((...))ไม่เป็นมาตรฐาน ( kshฟีเจอร์นี้รองรับbashและzshพร้อมกับชุดรูปแบบ)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.