Мне нужно сравнить мой ввод с клавишей Enter/Return...
read -n1 key
if [ $key == "\n" ]
echo "@@@"
fi
Но это не работает. Что не так с этим кодом
Мне нужно сравнить мой ввод с клавишей Enter/Return...
read -n1 key
if [ $key == "\n" ]
echo "@@@"
fi
Но это не работает. Что не так с этим кодом
Несколько проблем с опубликованным кодом. В комментариях подробно описано, что нужно исправить:
#!/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
sh file
для его выполнения, а не bash file
или просто ./file
, если у него есть chmod +x file
. Отмечу, что гуглить гораздо быстрее, чем писать такой комментарий.
- person m3nda; 19.03.2019
-r
, вы будете читать ""
для клавиши возврата и "\e"
для клавиши перехода, делая разницу между ними. Использование текущего read -s -n
удалит символы с обратной косой чертой, превратив их в ""
. Итак, просто read -r -s -n 1 key
решит.
- person m3nda; 19.03.2019
Также рекомендуется определить пустой $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
IFS=
- person m3nda; 19.03.2019
Я добавляю ниже код только для справки, если кто-то захочет использовать такое решение, содержащее цикл обратного отсчета.
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
read
читает строку из стандартного ввода, вплоть до новой строки в конце строки, но не включая ее. -n
указывает максимальное количество символов, заставляя read
возвращаться раньше, если вы достигаете этого количества символов. Однако он все равно закончится раньше, когда будет нажата клавиша Return. В этом случае возвращается пустая строка — все, кроме клавиши Return.
Вам нужно сравнить с пустой строкой, чтобы определить, сразу ли пользователь нажал Return.
read -n1 KEY
if [[ "$KEY" == "" ]]
then
echo "@@@";
fi
Ни одно из этих условий не сработало для меня, поэтому я придумал это:
${key} = $'\0A'
Протестировано на CentOS с Bash 4.2.46.