เปรียบเทียบสตริงโดยใช้ sh shell


197

ฉันใช้ SH เชลล์และฉันพยายามเปรียบเทียบสตริงกับค่าของตัวแปร แต่ifเงื่อนไขจะถูกดำเนินการเป็นจริงเสมอ ทำไม?

นี่คือรหัสบางส่วน:

Sourcesystem="ABC"

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

แม้จะใช้งานไม่ได้:

Sourcesystem="ABC"

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

ประการที่สองเราสามารถจับคู่กับ NULL หรือสตริงว่างได้หรือไม่?


อันดับแรกใน Bourne shell คุณไม่จำเป็นต้องมี ';' พิเศษ เมื่อฉันทดสอบรันสคริปต์ใน Bourne shell เงื่อนไข if เป็นเท็จ ขั้นแรกจะให้คำเตือน: [: ABC: ต้องใช้นิพจน์จำนวนเต็ม ผลลัพธ์คือ: "Sourcesystem is not Match ABC" ตามความคิดเห็นของผู้อื่น -eq ใช้สำหรับการเปรียบเทียบจำนวนเต็ม ใช้เครื่องหมายเท่ากับเครื่องหมายเดียวสำหรับการเปรียบเทียบสตริงใน Bourne shell (#! / bin / sh) เปลือกของคุณควรแก้ไขคุณตั้งแต่แรก
Kemin Zhou

6
การลงคะแนนเพื่อเปิดอีกครั้ง dups ที่อ้างถึงนั้นใช้สำหรับ bash shell ไม่ใช่ anemic sh shell ซึ่งบางครั้งก็เป็น Posix shell หรือ Dash
jww

1
เห็นด้วยจึงโหวต shและbashแบกความสัมพันธ์เช่นเดียวกับและC C++แม้ว่ารหัสที่เขียนขึ้นสำหรับข้อแรกจะใช้ได้ในข้อที่สอง แต่คำตอบสำหรับข้อที่สองไม่สามารถเชื่อถือได้ว่าจะทำงานในข้อแรกได้
btilly

คำตอบ:


290

คุณควรใช้ตัว=ดำเนินการเพื่อเปรียบเทียบสตริง:

Sourcesystem="ABC"

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

man testบอกว่าคุณใช้-zเพื่อจับคู่สตริงว่าง


2
ไม่จำเป็นต้องอ้างABCหรือXYZ.
สิ้นสุด

29
หากตัวแปรของคุณอาจมีช่องว่างในนั้นจำเป็นต้องมีการอ้างอิง
William Everett

1
ปรับตัวอย่างเพื่อให้ส่วนนั้นชัดเจนขึ้น @WilliamEverett
Per Lundberg


36

eq ใช้เพื่อเปรียบเทียบจำนวนเต็มใช้เท่ากับ '=' แทนเช่น

if [ 'AAA' = 'ABC' ];
then 
    echo "the same" 
else 
    echo "not the same"
fi

โชคดี


หมายเหตุ: หากคุณกำลังเปรียบเทียบตัวแปรให้แน่ใจว่าคุณใช้"$VAR"และไม่เพียง$VAR
Sridhar Sarnobat

22

ฉันมีปัญหาเดียวกันนี้ทำสิ่งนี้

if [ 'xyz' = 'abc' ];
then
echo "match"
fi

สังเกตช่องว่าง สิ่งสำคัญคือคุณต้องใช้ช่องว่างในกรณีนี้หลังและก่อน=เครื่องหมาย

ดู "ตัวดำเนินการเปรียบเทียบอื่น ๆ "


1
ใน Dockerfile: / bin / sh: 1: [: =: ตัวดำเนินการที่ไม่คาดคิด
holms

10

-eqเป็นตัวดำเนินการเปรียบเทียบเชลล์สำหรับการเปรียบเทียบจำนวนเต็ม =สำหรับการเปรียบเทียบสตริงคุณจำเป็นต้องใช้


5

-eqเป็นตัวดำเนินการเปรียบเทียบทางคณิตศาสตร์ ฉันไม่เคยใช้มันเพื่อเปรียบเทียบสตริงโดยอาศัย==และ!=เปรียบเทียบ

if [ 'XYZ' == 'ABC' ]; then   # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both
  echo "Match"
else
  echo "No Match"
fi

18
โปรดทราบว่าตัวดำเนินการ==ไม่ได้ทำงานกับทุกเชลล์ =เป็นตัวดำเนินการที่ถูกต้องที่จะใช้เพื่อเปรียบเทียบสตริงและ==บางครั้งก็เป็นคำพ้องความหมาย
Omer Dagan

3

จาก 4 เชลล์ที่ฉันทดสอบ ABC -eq XYZประเมินว่าเป็นจริงในtestบิวด์อินสำหรับzshและksh. ประเมินการแสดงออกภายใต้เท็จ/usr/bin/testและ builtins สำหรับและdash bashในkshและzshสตริงจะถูกแปลงเป็นค่าตัวเลขและมีค่าเท่ากันเนื่องจากทั้งคู่เป็น 0 IMO ลักษณะการทำงานของบิวน์อินสำหรับkshและzshไม่ถูกต้อง แต่ข้อมูลจำเพาะสำหรับtestไม่ชัดเจนในเรื่องนี้


1
ขอบคุณสำหรับการทดสอบ นั่นเป็นเหตุผลที่ Bourne shell เป็นที่นิยม
Kemin Zhou

zshอย่างชัดเจนเอาท์พุท: นิพจน์จำนวนเต็มคาดว่าหลังจากที่ใช้[หรือ builtin ทดสอบ บางทีคุณอาจบังคับให้[[ซึ่งประเมินว่าทั้งสองเป็น 0 เนื่องจากสตริงไม่ใช่จำนวนเต็มที่มีนัยสำคัญ
code933k

@ code933k รุ่นไหนครับ? ฉันจะไม่แปลกใจถ้าพฤติกรรมเปลี่ยนไป
William Pursell

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