2010-04-10 13 views
12

मैं तुलना करने के लिए के साथ अपने इनपुट दर्ज/वापसी कुंजी की आवश्यकता ...बैश शेल पटकथा - वापसी कुंजी/कुंजी दर्ज

read -n1 key 
if [ $key == "\n" ] 
    echo "@@@" 
fi 

लेकिन यह काम नहीं कर रहा है .. क्या इस कोड के साथ गलत है

+1

आप "अगर" और "गूंज" के बीच की रेखा पर "फिर" गायब हैं। एकमात्र समस्या नहीं है, लेकिन एक – Phil

उत्तर

28

पोस्ट कोड के साथ कई मुद्दे। इनलाइन टिप्पणी विस्तार क्या ठीक करने के लिए:

#!/bin/bash 
# ^^ Bash, not sh, must be used for read options 

read -s -n 1 key # -s: do not echo input character. -n 1: read only 1 character (separate with space) 

# double brackets to test, single equals sign, empty string for just 'enter' in this case... 
# if [[ ... ]] is followed by semicolon and 'then' keyword 
if [[ $key = "" ]]; then 
    echo 'You pressed enter!' 
else 
    echo "You pressed '$key'" 
fi 
4

read मानक इनपुट से एक पंक्ति पढ़ता है, लेकिन लाइन के अंत में नई लाइन भी शामिल नहीं है। -n वर्णों की अधिकतम संख्या निर्दिष्ट करता है, यदि आप उस संख्या के पात्रों तक पहुंचते हैं तो read को जल्दी लौटने के लिए मजबूर करते हैं। हालांकि यह अभी भी समाप्त हो जाएगा, जब रिटर्न कुंजी दबाया जाता है। इस मामले में, यह एक खाली स्ट्रिंग लौटा रहा है - रिटर्न कुंजी सहित सब कुछ।

आपको खाली स्ट्रिंग के खिलाफ तुलना करने की आवश्यकता है ताकि यह बताने के लिए कि उपयोगकर्ता ने तुरंत दबाया है।

read -n1 KEY 
if [[ "$KEY" == "" ]] 
then 
    echo "@@@"; 
fi 
1

यह भी, अच्छा विचार तुलना करने से पहले खाली $ आईएफएस (आंतरिक क्षेत्र विभाजक) को परिभाषित करने के लिए है क्योंकि अन्यथा आप के साथ "और" \ n "बराबर जा रहा है" गए हों।

तो कोड इस तरह दिखना चाहिए:

# for distinguishing " ", "\t" from "\n" 
IFS= 

read -n 1 key 
if [ "$key" = "" ]; then 
    echo "This was really Enter, not space, tab or something else" 
fi 
+0

# यह मेरे लिए काम नहीं करता है अगर लूप प्रिंटिंग coutdown IFS = echo -e "कीबोर्ड कॉन्फ़िगरेशन के लिए [ENTER] दबाएं।" के लिए ((i = 10; i> 0; i--)); printf "\ r $ i सेकंड में शुरू हो रहा है ..." read -n 1 -t 1 कुंजी यदि ["$ key" = $ '\ e']; तो गूंज "यह ESC है" तोड़ elif [ "$ कुंजी" == ""], तो गूंज -e "\ n अंतरिक्ष दबाया जाता है" तोड़ फाई शायद –

+0

किया बात इनलाइन वाक्य रचना के लिए वह यह है कि आपको आईएफएस = का उपयोग करना चाहिए; गूंज ... (अर्धविराम के साथ) – tsds

0

मैं सिर्फ संदर्भ के लिए नीचे दिए गए कोड जोड़ रहा है, तो कोई उलटी गिनती पाश युक्त इस तरह के समाधान का उपयोग करना चाहते हैं।

IFS='' 
echo -e "Press [ENTER] to start Configuration..." 
for ((i=10; i>0; i--)); do 

printf "\rStarting in $i seconds..." 
read -s -N 1 -t 1 key 

if [ "$key" = $'\e' ]; then 
     echo -e "\n [ESC] Pressed" 
     break 
elif [ "$key" == $'\x0a' ] ;then 
     echo -e "\n [Enter] Pressed" 
     break 
fi 

done 
संबंधित मुद्दे