ข้อผิดพลาด“ ผู้ประกอบการที่คาดหวังไม่พร้อม” ใน Bash หากมีเงื่อนไข


225

ฉันพยายามที่จะเข้าใจว่ามีอะไรผิดปกติ แต่ก็ไม่สามารถเข้าใจได้ ..

นี่คือส่วนที่ดูเหมือนว่าจะได้รับข้อผิดพลาด ..

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

ฉันได้รับข้อผิดพลาดนี้:

calc_1.2: line 75: [: =: unary operator expected

4
ผมคิดว่าคุณifคำสั่งในบรรทัด 75 fiต้องการ
Steve

7
หากมีข้อสงสัยอ้าง vars
koola

9
@koola, ใบเสนอราคา 'เสมอ'
CousinCocaine

คำตอบ:


480

ถ้าคุณรู้ว่าคุณมักจะใช้ทุบตีมันง่ายมากที่จะมักจะใช้วงเล็บคู่คำสั่งสารประกอบเงื่อนไข[[ ... ]]แทน Posix [ ... ]เข้ากันได้กับรุ่นวงเล็บเดียว ภายในการ[[ ... ]]ผสมการขยายคำแยกและชื่อพา ธ จะไม่ถูกนำไปใช้กับคำศัพท์ดังนั้นคุณสามารถไว้วางใจได้

if [[ $aug1 == "and" ]];

เพื่อเปรียบเทียบค่าของกับสตริง$aug1and

หากคุณใช้[ ... ]คุณต้องจำไว้เสมอว่าให้ใส่เครื่องหมายคำพูดคู่เช่น:

if [ "$aug1" = "and" ];

หากคุณไม่ได้อ้างถึงการขยายตัวของตัวแปรและตัวแปรนั้นไม่ได้ถูกกำหนดหรือว่างเปล่ามันจะหายไปจากที่เกิดเหตุ

if [ = "and" ]; 

ซึ่งไม่ใช่ไวยากรณ์ที่ถูกต้อง (นอกจากนี้ยังอาจล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดที่แตกต่างกันถ้ามี$aug1white space หรือ shell metacharacters)

[[ผู้ประกอบการที่ทันสมัยมีคุณสมบัติที่ดีอื่น ๆ มากมายรวมถึงการจับคู่นิพจน์ทั่วไป


9
"ทันสมัย"? ยังไม่ได้ [[ อยู่ในการทุบตีเสมอ ? มันอยู่ในเปลือก Korn มานานกว่ายี่สิบปีและทุบตีล่วงหน้า (ฉันรู้ว่าสิ่งที่คุณหมายแม้ว่า)
cdarke

31

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

[: =: unary operator expected

แก้ไข:

if [ "$APP_ENV" = "staging" ]

VS

if ["$APP_ENV" = "staging" ]

เช่นเดียวกับการตั้งค่า-xตัวแปรดีบักช่วยในการค้นหาสิ่งเหล่านี้:

set -x

มีคนยกข้อบกพร่องนี้ให้ฉันในสคริปต์สร้าง ช่วยฉันหน่อยได้ไหมขอบคุณ!
Kyle

8

ลองกำหนดค่า$aug1ก่อนใช้ในif[]คำสั่ง ข้อความแสดงข้อผิดพลาดจะหายไปในภายหลัง


0

คุณพูด ... :

elif [$ operation = "man"]; ถ้าหาก [$ aug1 = "เพิ่ม"]; จากนั้น # <- echo 75 บรรทัด "Man Page for: เพิ่ม" echo "" echo "ไวยากรณ์: เพิ่ม [หมายเลข 1] [หมายเลข 2]" echo "" echo "คำอธิบาย:" echo "เพิ่มตัวเลขสองตัวที่แตกต่างกันเข้าด้วยกัน" ข้อมูล echo "" echo ":" echo "เพิ่มใน v1.0" echo "" elif [-z $ aug1]; echo "โปรดระบุคำสั่งเพื่ออ่าน man page" else echo "ไม่มีหน้าคู่มือสำหรับคำสั่งนั้น" Fi

ฉันคิดว่ามันเป็นแค่ที่ว่าง ... ทำอย่างนี้:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

คุณยังสามารถตั้งค่าเริ่มต้นสำหรับตัวแปรได้ดังนั้นคุณไม่จำเป็นต้องใช้สอง "[" ซึ่งมีค่าเท่ากับสองกระบวนการ ("[" เป็นโปรแกรมจริง ๆ ) แทนที่จะเป็นหนึ่งโปรแกรม

มันไปตามไวยากรณ์นี้: $ {ตัวแปร: -default}

สิ่งทั้งหมดจะต้องมีการคิดในลักษณะที่ค่า "เริ่มต้น" นี้เป็นสิ่งที่แตกต่างจากค่า / เนื้อหา "ที่ถูกต้อง"

หากนั่นเป็นไปไม่ได้ด้วยเหตุผลบางอย่างที่คุณอาจต้องเพิ่มขั้นตอนเช่นการตรวจสอบว่ามีค่าทั้งหมดตามบรรทัด "ถ้า [-z $ VARIABLE]; จากนั้น echo" ตัวแปรจะต้องกรอก "" หรือ " ถ้า [! -z $ VARIABLE]; #everything ถือว่าใช้ได้ให้ดำเนินการกับสคริปต์ที่เหลือ "


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