หาก$VARIABLE
สตริงของคุณมีช่องว่างหรืออักขระพิเศษอื่น ๆและมีการใช้วงเล็บเหลี่ยมเดียว (ซึ่งเป็นทางลัดสำหรับtest
คำสั่ง) สตริงนั้นอาจถูกแยกออกเป็นหลายคำ แต่ละข้อถือเป็นอาร์กิวเมนต์แยกต่างหาก
ดังนั้นตัวแปรหนึ่งตัวจะถูกแบ่งออกเป็นหลาย ๆ อาร์กิวเมนต์ :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
เช่นเดียวกันจะเป็นจริงสำหรับการเรียกใช้ฟังก์ชันใด ๆ ที่วางสตริงที่มีช่องว่างหรืออักขระพิเศษอื่น ๆ
แก้ไขได้ง่าย
ล้อมรอบตัวแปรเอาต์พุตด้วยอัญประกาศคู่บังคับให้อยู่ในสตริงเดียว (ดังนั้นจึงมีหนึ่งอาร์กิวเมนต์) ตัวอย่างเช่น,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
เรียบง่ายเหมือนที่ แต่ข้ามไปที่ "ระวังด้วย ... " ด้านล่างหากคุณไม่สามารถรับประกันได้ว่าตัวแปรของคุณจะไม่ใช่สตริงว่างเปล่าหรือสตริงที่ไม่มีอะไรนอกจากช่องว่าง
หรือการแก้ไขทางเลือกคือการใช้วงเล็บเหลี่ยมสองชั้น (ซึ่งเป็นทางลัดสำหรับnew test
คำสั่ง)
สิ่งนี้มีอยู่ใน bash เท่านั้น (และเห็นได้ชัดว่า korn และ zsh) และอาจไม่สามารถทำงานร่วมกับเชลล์เริ่มต้นที่ถูกเรียก/bin/sh
เป็นต้น
ซึ่งหมายความว่าในบางระบบอาจใช้งานได้จากคอนโซล แต่ไม่ใช่เมื่อมีการโทรไปที่อื่นเช่นจากcron
ขึ้นอยู่กับการกำหนดค่าทุกอย่าง
มันจะมีลักษณะเช่นนี้:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
ถ้าคำสั่งของคุณมีวงเล็บคู่เช่นนี้และคุณได้รับข้อผิดพลาดในบันทึก แต่การทำงานจากคอนโซลลองสลับออก[[
หาทางเลือกแนะนำที่นี่หรือตรวจสอบให้แน่ใจว่าสิ่งที่เรียกใช้สคริปต์ของคุณใช้เปลือกที่สนับสนุนอาคา[[
new test
ยังระวัง[: unary operator expected
ข้อผิดพลาด
หากคุณเห็นข้อผิดพลาด "มีอาร์กิวเมนต์มากเกินไป" โอกาสที่คุณจะได้รับสตริงจากฟังก์ชันที่มีเอาต์พุตที่ไม่สามารถคาดเดาได้ หากเป็นไปได้ที่จะได้รับสตริงว่าง (หรือสตริงช่องว่างทั้งหมด) นี่จะถือว่าเป็นศูนย์อาร์กิวเมนต์แม้ว่าจะมี "การแก้ไขด่วน" ข้างต้นและอาจล้มเหลวด้วย[: unary operator expected
ก็เหมือนกับ 'gotcha' ถ้าคุณคุ้นเคยกับภาษาอื่น - คุณไม่คาดหวังว่าเนื้อหาของตัวแปรจะพิมพ์ลงในรหัสอย่างมีประสิทธิภาพเช่นนี้ก่อนที่จะถูกประเมิน
นี่คือตัวอย่างที่ป้องกันไม่ให้ทั้งสอง[: too many arguments
และ[: unary operator expected
ข้อผิดพลาด: เปลี่ยนเอาท์พุทที่มีค่าเริ่มต้นถ้ามันเป็นที่ว่างเปล่า (ในตัวอย่างนี้0
) กับคำพูดสองห่อรอบสิ่งทั้งหมด:
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(ที่นี่การกระทำจะเกิดขึ้นหาก $ VARIABLE เป็น 0 หรือว่างเปล่าโดยธรรมชาติคุณควรเปลี่ยน 0 (ค่าเริ่มต้น) เป็นค่าเริ่มต้นอื่นหากต้องการพฤติกรรมที่แตกต่างกัน)
หมายเหตุสุดท้าย:เนื่องจาก[
เป็นทางลัดสำหรับtest
ทั้งหมดข้างต้นจึงเป็นจริงสำหรับข้อผิดพลาดtest: too many arguments
(และยังtest: unary operator expected
)