शेल प्रांप्ट से 'यस' की विविधताओं को स्वीकार करने का बेहतर तरीका


27

शेल स्क्रिप्ट की प्रयोज्य परीक्षण मैंने लिखा है कि लोगों को अलग-अलग अपेक्षाएं थीं कि कैसे एक प्रश्न का उत्तर दिया जाए जो उत्तर के रूप में 'हां' की उम्मीद करता है। नीचे दिए गए कोड उदाहरण में विविधताएं देखें।

निश्चित रूप से एक बेहतर तरीका होना चाहिए कि मैं क्या लेकर आया हूं? इस पर आपका पठनीय और छोटा रूप क्या है ?

read -p 'Answer this question with yes: ' answer
if [ "$answer" = 'Y'
  -o "$answer" = 'YES'
  -o "$answer" = 'Yes'
  -o "$answer" = 'y'
  -o "$answer" = 'yes'
  -o some-alternate-condition ]; then

  echo 'Surely this can be written better?'
fi

2
बंद करने के लिए वोट दिया गया। जब मैं सवाल में दिलचस्पी लेता हूं, तो यह संभवतः एक प्रोग्रामिंग प्रश्न है, इसलिए एसओ पर होना चाहिए।
फ्यूनहे

एक प्रोग्रामिंग उत्तर कुछ बश की
phunehehe

3
@phunehehe: मैं एसओ के पास जाने से असहमत हूं, न केवल इसलिए क्योंकि हमारे पास शेल प्रोग्रामिंग को स्वीकार करने का इतिहास है, बल्कि इसलिए भी कि यह केवल यह करने का सवाल नहीं है कि यह कैसे होना चाहिए, बल्कि यह भी सवाल होना चाहिए कि कल्पना क्या होनी चाहिए।
गाइल्स का SO- बुराई पर रोक '22

4
मैंने एक बार एक स्क्रिप्ट लिखी थी। तब कार्यक्रम का फ्रेंच और सरलीकृत चीनी में अनुवाद किया गया था। मैंने फ्रांसीसी संस्करण को स्किम किया और देखा कि मेरा प्रॉम्प्ट "एंटर यू या नॉन" करने के लिए अनुवादित किया गया था, लेकिन निश्चित रूप से कोड अभी भी "Y *" या "N *" चाहता था
बेन जैक्सन

जवाबों:


15

caseका उपयोग करना कुछ हद तक समतुल्य है लेकिन सही नहीं है क्योंकि कथन YEस्वीकार किए जाते हैं।

read -p 'Answer this question with yes: ' answer
case "${answer}" in
    [yY]|[yY][eE][sS])
        echo 'Surely this can be written better?' ;;
esac

3
मैं कहूंगा कि उपयोगकर्ता का इरादा 'तु' से बहुत स्पष्ट है।
शाम

48

localeउपयोगिता का उपयोग करके UNIX मानक इसके लिए उदाहरण कोड प्रदान करता है :

if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
    affirmative processing goes here
else
    non-affirmative processing goes here
fi

POSIXलोकेल में (और वास्तविक सिस्टम पर अंग्रेजी स्थानों पर) 'yesexpr' का मान है "^[yY]"। इसकी व्याख्या एक विस्तारित नियमित अभिव्यक्ति के रूप में की जानी है। Noexpr भी देखें।


1
अच्छा लगा। लेकिन मैं एक बेवकूफ लग रहा हूँ। मुझे उन तर्कों की सूची कहां मिल सकती है जिनके localeबारे में जानते हैं? मेरे मैक ओएस 10.5 बॉक्स पर मैन पेज उन्हें नहीं लगता है।
dmckee

अच्छा लगा। क्या आप कृपया स्रोत से लिंक कर सकते हैं?
ऐयून

3
@ काम आप locale -k LC_MESSAGES(और अन्य LC_whatever के लिए) कर सकते हैं , या मानक द्वारा परिभाषित लोगों के लिए यहां देख सकते हैं । @Daniel स्थानीय उपयोगिता पृष्ठ के अलावा और कौन सा स्रोत है जो मैंने लिंक किया था?
रैंडम 832

1
महान जवाब, निश्चित रूप से स्वीकार किया जाना चाहिए।
जुलियाग्रे

6

यदि आप स्वतंत्र रूप से शीघ्रता प्रदर्शित करते हैं, तो बैश में रहें (या कोई अन्य शेल):

case $answer in
  [Yy]*) echo Ok;;
  *) echo "Can't you read? I said to say yes.";;
esac

यह प्रतिक्रियाओं ynको हाँ के रूप में स्वीकार करता है ,  y(प्रारंभिक स्थान के साथ) नहीं के रूप में, और wlkjzuhfodनहीं के रूप में, जो कि इष्टतम नहीं हो सकता है, लेकिन विशिष्ट शेल संकेतों के अनुरूप है: यह है कि rm -i, find -okऔर अन्य इसे करते हैं।

यह अंतर्राष्ट्रीयकरण के पूरे मुद्दे को बढ़ाता है: अन्य भाषाओं में, आपको अपेक्षित प्रतिक्रियाओं का अनुवाद करना होगा। फिर कोई मानक शेल विधि नहीं है; आप संवाद की ओर मुड़ सकते हैं , लेकिन फिर आपकी स्क्रिप्ट को इसे स्थापित करने की आवश्यकता होगी (यह कई वितरणों में उपलब्ध है लेकिन हमेशा डिफ़ॉल्ट रूप से स्थापित नहीं होता है)।

if dialog --yesno "Choose yes" 0 0; then 

3

मैं आमतौर पर एक साधारण फ़ंक्शन का उपयोग करता हूं:

Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }

फ़ंक्शन बस वापस लौटता है 0यदि दर्ज किया जाता है Yया यदि कुछ और दर्ज किया जाता है। इसका उपयोग इसके साथ किया जा सकता है :y1if...fi

if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi

या बस इस तरह:

Confirm "Type y" && echo "You typed y"

-sक्या टाइप किया गया था की एक दृश्य इतिहास है करने के लिए ले लो ।
टॉम हेल

0

बस @faif ans को फिर से संशोधित किया

YesOrNo() {
        while :
        do
                read -p 'Do you want to Continue (yes/no?): ' answer
                case "${answer}" in
                    [yY]|[yY][eE][sS]) exit 0 ;;
                        [nN]|[nN][oO]) exit 1 ;;
                esac
        done
}


if $( YesOrNo ); then
        echo "Ans is yes.. Do something....."
else
        echo "Ans is No... skip.."
fi

परीक्षा

root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):  # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.