2010-04-10 19 views
12

Ich brauche meine Eingabe mit /Return Enter Schlüssel vergleichen ...Bash Shell Scripting - Return-Taste/Enter-Taste

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

Aber das funktioniert nicht .. Was ist mit diesem Code ist fehlerhaft

+1

Sie vermissen "dann" in der Zeile zwischen "if" und "echo". Nicht das einzige Problem, aber eins – Phil

Antwort

28

Mehrere Probleme mit dem gebuchten Code. Inline-Kommentare Detail ein, was zu beheben:

#!/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 liest eine Zeile vom Standardeingang bis zur neuen Zeile am Ende der Zeile. -n gibt die maximale Anzahl an Zeichen an und erzwingt die Rückgabe von read, wenn Sie diese Anzahl an Zeichen erreichen. Es wird jedoch immer noch früher beendet, wenn die Taste Return gedrückt wird. In diesem Fall gibt es eine leere Zeichenfolge zurück - alles bis auf Return Schlüssel.

Sie müssen mit der leeren Zeichenfolge vergleichen, um festzustellen, ob der Benutzer sofort gedrückt hat Zurück.

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

Auch ist es gute Idee, leer $ IFS (interne Feldtrenn) zu definieren, bevor Vergleiche, denn sonst können Sie mit „“ und „\ am Ende n“ gleich.

So sollte der Code wie folgt aussehen:

# 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

#dies funktioniert nicht für mich, wenn die Verwendung von Loop-Druck coutdown IFS = Echo-e "Drücken Sie [ENTER] für Tastaturkonfiguration." für ((i = 10; i> 0; i--)); do printf "\ rStart in $ i Sekunden ..." lesen -n 1 -t 1 Taste if ["$ key" = $ '\ e']; dann echo Pause elif "Das ESC ist" [ "$ key" == ""], dann echo -en "\ n Raum gedrückt wird" Pause fi getan –

+0

vielleicht ist das, was für die Inline-Syntax Sie sollten IFS = verwenden; Echo ... (mit Semikolon) – tsds

0

ich unten Code hinzufügen bin nur als Referenz, wenn jemand eine solche Lösung verwenden, die Countdown-Schleife wollen.

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