กำลังประมวลผลการตอบรับใช่ / ไม่จากผู้ใช้ Bash


11

สิ่งนี้เป็นอย่างดีอาจจะโง่ในส่วนของฉัน ฉันต้องการยอมรับว่าใช่ / ไม่ใช่คำตอบจริง / เท็จภายในสคริปต์ Bash ของฉัน:

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

นี่คือตัวอย่างผลลัพธ์:

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh เลขที่

User passed in No
Decline

ตอนนี้ stumper ทำไม[[ "${OPTARG^^}" == "N" ]]คืนเป็นจริงสำหรับสตริงใด ๆ !

./test.sh ใช่

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

จะเกิดอะไรขึ้นถ้าคุณเสนอราคานี้? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
ไม่เป็นไร. Goldilocks ถูกต้อง
mikeserv

คำตอบ:


10

นี้:

if [[ "$OPTARG" -eq 0 ]] 

จะจับคู่สตริงใด ๆ ยกเว้นว่าจะเป็นเพียงตัวเลข ใช้:

if [[ "$OPTARG" == "0" ]] 

แทน.


8

แม้ว่าปัญหาในรหัสของคุณจะได้รับการอธิบายอย่างดีจากgoldilocksแต่ฉันก็อดไม่ได้ที่จะบอกว่ารหัสของคุณมีความยาวโดยไม่จำเป็น คุณสามารถทำให้มันง่ายขึ้นมาก

ต่อไปนี้เทียบเท่ากับรหัสที่คุณต้องการ:

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

นอกจากนี้คุณยังอาจต้องการที่จะอ้างถึงเงื่อนไข Constructsในคู่มือ


ขอบคุณ devnull แน่นอนฉันจะใช้เคล็ดลับนี้ในสคริปต์ในอนาคต! ฉันถูกฉีกขาดว่าฉันควรยอมรับคำตอบของคุณหรือไม่ แต่ฉันคิดว่าความแตกต่างในคำตอบของ goldilocks อาจเป็นประโยชน์สำหรับผู้อื่น
i_grok

@i_grok ฉันได้พูดถึงคำตอบของฉันว่าคำตอบของ goldilocks ชี้ไปที่ปัญหา ฉันนำเสนอวิธีการอื่นที่ดูเหมือนจะอ่านง่ายขึ้น เป็นการดีที่จะเห็นวิธีการหลายวิธีในการแก้ปัญหาที่เกิดขึ้น เกี่ยวกับคำตอบที่ได้รับการยอมรับเป็นเรื่องที่ค่อนข้างน่ารำคาญ
devnull

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