Bash Shell Scripting - 返回键/ Enter键

时间:2010-04-10 04:44:45

标签: bash shell

我需要将输入与输入 / 返回键进行比较......

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

但这不起作用..这段代码有什么问题

5 个答案:

答案 0 :(得分:34)

发布代码的几个问题。内联注释详细说明要修复的内容:

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

答案 1 :(得分:4)

read从标准输入读取一行,直到但不包括该行末尾的新行。 -n指定了最大字符数,如果达到该字符数,则迫使read提前返回。但是,当按下 Return 键时,它仍然会更早结束。在这种情况下,它返回一个空字符串 - 所有内容都包括但不包括 Return 键。

您需要与空字符串进行比较,以判断用户是否立即按返回

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

答案 2 :(得分: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

答案 3 :(得分: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 :(得分:0)

这些条件都不适合我,因此我提出了这个条件:

${key} = $'\0A'

使用Bash 4.2.46在CentOS上进行了测试。