Memproses Jawaban Ya / Tidak dari Pengguna Bash

11

Mungkin ini kebodohan saya. Saya ingin menerima jawaban Ya / Tidak, Benar / Salah dalam skrip Bash saya:

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

Berikut adalah beberapa hasil sampel:

./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 Tidak

User passed in No
Decline

Sekarang bungkam itu. Mengapa [[ "${OPTARG^^}" == "N" ]]mengembalikan true untuk string apa pun !?

./test.sh Ya

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline
i_grok
sumber
apa yang terjadi jika Anda mengutip ini? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv
1
Sudahlah. Goldilocks benar.
mikeserv

Jawaban:

10

Ini:

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

Akan cocok dengan string apa pun, kecuali hanya digit. Menggunakan:

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

Sebagai gantinya.

goldilocks
sumber
8

Meskipun masalah dalam kode Anda telah dijelaskan dengan baik oleh goldilocks , saya tidak dapat menahan diri untuk mengatakan bahwa kode Anda terlalu panjang. Anda bisa menyederhanakannya banyak.

Berikut ini setara dengan kode yang Anda inginkan:

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

Anda mungkin juga ingin merujuk pada Conditional Constructs dalam manual .

devnull
sumber
Terima kasih, devnull. Saya pasti akan menggunakan trik ini dalam skrip berikutnya! Saya bingung apakah saya harus menerima jawaban Anda, tetapi saya pikir perbedaan dalam jawaban goldilocks mungkin bermanfaat bagi orang lain.
i_grok
@ i_grok Saya memang menyebutkan dalam jawaban saya bahwa jawaban goldilocks menunjuk ke masalah. Saya hanya menyajikan pendekatan alternatif yang tampaknya lebih mudah dibaca . Adalah baik untuk melihat berbagai pendekatan untuk menyelesaikan masalah. Mengenai jawaban mana yang diterima adalah urusan yang relatif sepele.
devnull
6

Anda juga bisa menggunakannya 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
Rahul Patil
sumber