Подтвердить что ты не робот

Bash Сценарий оболочки - клавиша возврата/клавиша ввода

Мне нужно сравнить свой ввод с ключом Enter/Return...

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

Но это не работает. Что не так с этим кодом.

4b9b3361

Ответ 1

Несколько проблем с опубликованным кодом. Встроенные комментарии подробно о том, что нужно исправить:

#!/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

Ответ 2

read читает строку со стандартного ввода, но не включая новую строку в конце строки. -n указывает максимальное количество символов, заставляя read возвращаться раньше, если вы достигнете этого количества символов. Это все равно закончится раньше, однако, когда нажата клавиша Return. В этом случае возвращается пустая строка - все до, но не включая ключ Return.

Вам нужно сравнить с пустой строкой, чтобы указать, немедленно ли нажал пользователь Return.

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

Ответ 3

Также полезно определить пустой $IFS (внутренний разделитель полей) перед выполнением сравнений, поскольку в противном случае вы можете оказаться равным "и" \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

Ответ 4

Я добавляю ниже код только для справки, если кто-то захочет использовать такое решение, содержащее цикл обратного отсчета.

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