ใน Bash แล้วถ้า [-z“ $ 1”] และถ้า [“ $ 1” =“”] เหมือนกันล่ะ


28

ในการสคริปต์เชลล์ Bash ความแตกต่าง (ถ้ามี) ระหว่างสองข้อความต่อไปนี้คืออะไร?

    1. ) if [ -z "$1" ]
    2. ) if [ "$1" = "" ]

ฉันพบว่าตัวเองเขียนบทที่สองในบางบท แต่จากนั้นฉันอ่านที่นี่ว่าการใช้-zประสบความสำเร็จในสิ่งเดียวกัน

หากมีปัญหาในการใช้อันที่สองเราควรเพิกเฉยที่อันแรกดูดีขึ้นเล็กน้อยหรือไม่


3
สำหรับการเปรียบเทียบอย่างละเอียดดูคำตอบของฉันใน Stack Overflow ดูสิ่งนี้และสิ่งนี้ด้วย
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

การเชื่อมโยงที่ดีกับคำตอบที่ดีบางอย่าง :)
โยฮัน

คำตอบ:


36

[ "$1" = "" ]และ[ -z "$1" ]เทียบเท่าใน bash และเชลล์ที่สอดคล้องกับ POSIX อื่น ๆ (โปรดทราบว่าจะต้องมีช่องว่างในแต่ละด้านของวงเล็บยกเว้นว่ามีอักขระที่ไม่ใช่คำที่เป็นองค์ประกอบเช่น;)

[เป็นเปลือกในตัวเหมือนคนอื่น ๆ ; ในความเป็นจริงมันสามารถสะกดได้test(ความแตกต่างเพียงอย่างเดียวระหว่างสองคือ[ต้องใช้]เป็นอาร์กิวเมนต์สุดท้าย) ดังนั้นถ้าคุณทำงาน[ "$1" = "" ]กับ$1การขยายไปยัง-zผู้ประกอบการทดสอบเห็นสามข้อโต้แย้ง: -z, =และสตริงที่ว่างเปล่า เชลล์Bourne ที่มีอายุมากกว่าบางครั้งโยนข้อผิดพลาดในการแยกวิเคราะห์เมื่อตัวถูกดำเนินการดูเหมือนตัวดำเนินการในลักษณะนี้แม้ว่าจะไม่มีความคลุมเครือในการแสดงออกที่สมบูรณ์ ฉันไม่รู้ว่าจริง ๆ แล้วเวอร์ชันใดมีปัญหากับการแสดงออกเฉพาะนี้หรือไม่ แต่การแสดงออกที่ซับซ้อนมากขึ้นอาจทำให้พวกเขาทิ้งไป อาจมีรุ่นที่มีปัญหากับคำที่ว่างเปล่า สิ่งเหล่านี้จะไม่ได้รับการสนับสนุน[ -z "$1" ]เช่นกัน สำนวนเชลล์ทั่วไปคือ[ x"$1" = x"" ]. มันหลีกเลี่ยงความเสี่ยงใด ๆ ของการถูกดำเนินการแจงเป็นตัวดำเนินการเนื่องจากไม่มีตัวดำเนินการเริ่มต้นด้วยตัวอักษร

ใน ksh, bash และ zsh คุณสามารถใช้ไวยากรณ์วงเล็บคู่[[ -z $1 ]]ได้ ไวยากรณ์ที่ใหม่กว่านี้ (มาจากช่วงปลายทศวรรษที่ 1980 แทนที่จะเป็นช่วงกลางทศวรรษ 1970) ช่วยลดความเสี่ยงในการถูกดำเนินการแยกวิเคราะห์เป็นตัวดำเนินการโดยใช้โครงสร้างประโยคแบบพิเศษมากกว่าแบบธรรมดาทั่วไป ตัวดำเนินการต้องปรากฏตามตัวอักษรไม่ต้องใส่เครื่องหมายคำพูดในวงเล็บคู่และคุณไม่จำเป็นต้องเพิ่มเครื่องหมายคำพูดซ้ำเพื่อขยาย


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