बैश उपयोगकर्ता से हाँ / नहीं प्रतिक्रिया संसाधित करना


11

यह बहुत अच्छी तरह से मेरी ओर से मूर्खता हो सकती है। मैं अपनी बैश स्क्रिप्ट के भीतर हां / नहीं, सच्ची / गलत प्रतिक्रिया स्वीकार करना चाहता हूं:

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 ०

User passed in 0
Decline

./test.sh १

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh नहीं

User passed in No
Decline

अब तना हुआ। क्यों [[ "${OPTARG^^}" == "N" ]]किसी भी स्ट्रिंग के लिए सच लौट रहा है !?

./test.sh हाँ

User passed in Yes
Decline

./test.sh

User passed in ThisShouldNotMatch
Decline

यदि आप इसे उद्धृत करते हैं तो क्या होता है? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
कोई बात नहीं। गोल्डीलॉक्स सही है।
प्रातः

जवाबों:


10

यह:

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

किसी भी स्ट्रिंग से मेल खाएगा, जब तक कि यह केवल अंक न हो। उपयोग:

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

बजाय।


8

हालाँकि आपके कोड की समस्या को गोल्डीलॉक्स द्वारा अच्छी तरह समझाया गया है , लेकिन मैं यह कहकर विरोध नहीं कर सकता कि आपका कोड अनावश्यक रूप से लंबा है। आप इसे बहुत सरल बना सकते हैं।

निम्नलिखित आपके इच्छित कोड के बराबर है:

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

आप मैनुअल में सशर्त निर्माण को भी संदर्भित करना चाह सकते हैं ।


धन्यवाद, देवनुल मैं भविष्य की स्क्रिप्ट में इस ट्रिक का उपयोग जरूर करूँगा! मुझे फट गया था कि क्या मुझे आपका जवाब स्वीकार करना चाहिए, लेकिन मुझे लगता है कि गोल्डीलॉक्स के जवाब में अंतर दूसरों के लिए मददगार हो सकता है।
इगोरोक

@i_grok मैंने अपने जवाब में उल्लेख किया है कि गोल्डीलॉक्स का जवाब समस्या का संकेत देता है। मैंने बस एक वैकल्पिक दृष्टिकोण प्रस्तुत किया जो अधिक पठनीय लगता था । किसी समस्या को हल करने के लिए कई दृष्टिकोणों को देखना अच्छा है। जिसके संबंध में उत्तर स्वीकार किया जाता है, वह अपेक्षाकृत तुच्छ मामला है।
देवनाउल

6

इसके अलावा आप उपयोग कर सकते हैं 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.