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

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.


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 .


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.