Bash Kullanıcısından Evet / Hayır Yanıtını İşleme


11

Bu benim açımdan aptallık olabilir. Bash betiğimdeki Evet / Hayır, Doğru / Yanlış yanıtlarını kabul etmek istiyorum:

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

İşte bazı örnek sonuçlar:

./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 Hayır

User passed in No
Decline

Şimdi ise tampon. [[ "${OPTARG^^}" == "N" ]]Herhangi bir dize için neden doğru döndürülüyor?

./test.sh Evet

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

bunu teklif edersen ne olur? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
Boşver. Goldilocks haklı.
Mayıs 14'te mikeserv

Yanıtlar:


10

Bu:

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

Sadece rakam olmadığı sürece herhangi bir dizeyle eşleşecektir. kullanın:

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

Yerine.


8

Kodunuzdaki sorun goldilocks tarafından iyi açıklanmış olmasına rağmen, kodunuzun gereksiz yere uzun olduğunu söylemeye dayanamıyorum. Bunu çok basitleştirebilirsiniz.

Aşağıdakiler istediğiniz koda eşdeğerdir:

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

Ayrıca bakınız isteyebilirsiniz Şartlı Yapıtlarının içinde manuel .


Teşekkürler devnull. Bu hileyi kesinlikle gelecekteki senaryolarda kullanacağım! Cevabınızı kabul edip etmeme konusunda yırtılmıştım, ama goldilocks'ın cevabındaki ayrımların başkaları için yararlı olabileceğini düşünüyorum.
i_grok

@i_grok Cevabımda goldilocks'ın sorunun cevabını gösterdiğinden bahsettim. Daha okunaklı görünen alternatif bir yaklaşım sundum . Bir problemi çözmek için birden fazla yaklaşım görmek iyi bir fikirdir. Hangi cevabın kabul edildiğine bakmak nispeten önemsiz bir olaydır.
Mart'ta devnull

6

Ayrıca kullanabilirsiniz case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.