ฉันจะเปรียบเทียบตัวแปรกับสตริงข้อความแทนที่จะเป็นจำนวนเต็มในคำสั่ง if / else ได้อย่างไร


24

ในขั้นตอนการเขียนเชลล์สคริปต์ฉันพบปัญหาด้วยคำสั่ง if / else ต่อไปนี้ซึ่งอยู่ตรงกลางของสคริปต์:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

ข้อผิดพลาดที่กลับมาเป็น:

./gitup: line 13: [: add: integer expression expected

แล้วจึงดำเนินการกับส่วนที่เหลือของสคริปต์ ฉันจะมีถ้าเซ็กเมนต์ประเมิน / เปรียบเทียบตัวแปรกับอินพุตสตริงแทนที่จะเป็นจำนวนเต็ม; ต้องการข้อผิดพลาดที่แตกต่างกันเมื่อใช้ "! =" ท่ามกลางสิ่งอื่นที่ฉันลอง

คำตอบ:


38

บางสิ่งเช่นนี้

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eqใช้สำหรับการเปรียบเทียบตัวเลขใช้=สำหรับการเปรียบเทียบสตริง


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

3
@josephmarhee: โปรดทราบว่าการ[[]]ทดสอบเป็นโครงสร้างเฉพาะของ Bash และตัวอย่างนี้ใช้ได้กับ POSIX []เช่นเดียวกับที่ใช้ในคำถาม หากมีการให้ล่ามอย่างชัดเจน#!/bin/bashหรือคล้ายกัน[[]]สามารถใช้งานได้โดยไม่มีปัญหา (และมันเร็วกว่าตัวเลือกอื่นใน Bashฉันเชื่อว่า - ไม่ใช่ว่ามันควรจะเป็นคอขวดอยู่แล้ว) มิฉะนั้นก็ควรติด[]อยู่ หากไม่มีใครต้องการ Bash ที่เฉพาะเจาะจงสคริปต์จะทำงานได้เร็วขึ้นเล็กน้อยเช่น Dash และ POSIX รับประกันความสะดวกในการพกพา
Daniel Andersson

4

วิธีนี้ก็ใช้ได้เช่นกัน คล้ายกับคำตอบของ @ Guru มาก แต่ไม่จำเป็นต้องใช้วงเล็บเหลี่ยมสองอัน

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.