2010-04-10 16 views
12

ho bisogno di confrontare il mio ingresso con Inserisci/ritorno chiave ...Bash Shell Scripting - chiave di ritornare/Enter

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

Ma questo non funziona .. Cosa c'è di sbagliato con questo codice

+1

Manca "quindi" sulla linea tra "se" ed "echo". Non è l'unico problema, ma uno di questi è il – Phil

risposta

28

Diversi problemi con il codice pubblicato. commenti in linea dettaglio cosa sistemare:

#!/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 legge una riga dall'input standard, fino a non includere la nuova riga alla fine della riga. -n specifica il numero massimo di caratteri, forzando read a tornare presto se si raggiunge quel numero di caratteri. Tuttavia, terminerà ancora prima quando viene premuto il tasto Return. In questo caso, restituisce una stringa vuota - tutto fino a ma non incluso il Restituisce la chiave.

È necessario confrontare la stringa vuota per stabilire se l'utente ha immediatamente premuto Restituisce.

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

Inoltre è opportuno definire $ IFS vuoti (separatore di campo interno) prima di fare paragoni, perché altrimenti si può finire con "" e "\ n" parità di condizioni.

Quindi il codice dovrebbe essere simile a questo:

# 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

# non funziona per me se si utilizza il ciclo di stampa coutdown IFS = echo -e "Premere [INVIO] per Configurazione tastiera." per ((i = 10; i> 0; i--)); do printf "\ r Avvio in $ i secondi ..." leggi -n 1 -t 1 chiave se ["$ chiave" = $ '\ e']; poi echo "Questo è ESC" pausa elif [ "chiave di $" == ""], poi echo -e "viene premuto spazio \ n" pausa fi fatto –

+0

forse la cosa è che per la sintassi in linea dovresti usare IFS =; echo ... (con punto e virgola) – tsds

0

Sto aggiungendo il codice qui sotto appena per riferimento, se qualcuno vorrà utilizzare tale soluzione contenente ciclo conto alla rovescia.

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 
Problemi correlati