สำหรับคำตอบเวอร์ชันเก่าให้ดูส่วนที่สองของคำตอบนี้ หากคุณต้องการทราบรายละเอียดให้อ่านต่อ
สาเหตุของปัญหา
ในคำถามตัวเองมีรายงานว่า OP เห็นtoo many arguments error
ซึ่งเมื่อทดสอบในbash
ดูเหมือนจะไม่เป็นกรณี:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
ด้วย/bin/sh
ซึ่งเป็น symlinked จริง/bin/dash
บน Ubuntu, รายงานข้อผิดพลาดดังต่อไปนี้:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
และสแตนด์อโลน/bin/test
ยัง:
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Sidenote: หากคุณสงสัยว่าอะไรคืออะไร/usr/bin/test
และทำไมฉันถึงใช้งานbash
และsh
คุณควรรู้ว่านั่น[
คือนามแฝงสำหรับtest
คำสั่งซึ่งยังมีอยู่ว่าเป็นปฏิบัติการแบบสแตนด์อโลนหรือมากกว่าปกติ - เป็นเชลล์ในตัวซึ่งเป็นสิ่งที่แต่ละเชลล์จะใช้ก่อน . สำหรับif
คำสั่งพวกเขาทำงานกับรูปปั้นทางออกของคำสั่งดังนั้นทำไม[
และtest
เป็นคำสั่งด้วยทุกสิ่งที่เป็นข้อโต้แย้งกับคำสั่งนั้น - ลำดับที่ไม่เหมาะสมของ args บรรทัดคำสั่งเหล่านั้นนำไปสู่ข้อผิดพลาด
กลับไปที่หัวข้อ: มันไม่ชัดเจนว่า OP ได้รับข้อผิดพลาดที่ไม่เกี่ยวข้องอย่างไร อย่างไรก็ตามในทั้ง 3 กรณีปัญหาจะเหมือนกัน - ตัวแปรที่ไม่ได้ตั้งค่าจะถือว่าว่างเปล่าดังนั้นสิ่งที่เชลล์เห็นพร้อมกับตัวแปรที่ไม่ได้อ้างอิง
[ != '' ]
ซึ่งแบ่งไวยากรณ์ที่test
เข้าใจ จำสิ่งที่ฉันพูดเกี่ยวกับลำดับของอาร์กิวเมนต์บรรทัดคำสั่งที่ไม่เหมาะสมได้หรือไม่ ดังนั้นทำไมการอ้างถึงจึงมีความสำคัญ ลองเปิดใช้งานเอาต์พุตการวินิจฉัยและดูว่าเชลล์ดำเนินการอะไร:
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
วิธีที่ดีกว่าในการทดสอบตัวแปรที่ไม่มีการตั้งค่า
วิธีการที่พบเห็นบ่อยมากคือ:
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
หากต้องการอ้างอิงGilles :
ใน ["x $ 1" = "x"] คำนำหน้า x ช่วยให้มั่นใจได้ว่า x "$ 1" อาจดูไม่เหมือนโอเปอเรเตอร์ดังนั้นวิธีเดียวที่เชลล์สามารถแยกวิเคราะห์การทดสอบนี้ได้คือการปฏิบัติ = เป็นโอเปอเรเตอร์ไบนารี
สันนิษฐานว่าน่าจะพกพาได้พอสมควรเพราะฉันเห็นสิ่งเหล่านี้ใน/bin/sh
สคริปต์ นอกจากนี้ยังสามารถรวมกันเป็นระบบ
if [ "x${var1}${var2}" == "x" ]; then
...
fi
แน่นอนว่าเราสามารถใช้-z
ธงได้อย่างไรก็ตามจากการวิจัยในหอยบางตัวโดยเฉพาะ ksh88 (ตามStephane Chazelas ) ธงนี้ผิดพลาด
ดูสิ่งนี้ด้วย