23

入力をEnter/Returnキーと比較する必要があります...

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

しかし、これは機能していません..このコードの何が問題なのですか

4

5 に答える 5

39

投稿されたコードに関するいくつかの問題。インライン コメントは、何を修正するかを詳しく説明します。

#!/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
于 2010-04-10T04:56:26.280 に答える
7

また、比較を行う前に空の $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
于 2016-02-17T21:50:09.907 に答える
6

誰かがカウントダウンループを含むそのようなソリューションを使用したい場合は、参考のために以下のコードを追加しています。

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
于 2016-04-26T08:54:33.607 に答える
4

read標準入力から、行末の改行まで (改行は含まない) 行を読み取ります。 -n最大文字数を指定し、readその文字数に達した場合は強制的に早く戻ります。ただし、Returnキーが押されると、それはまだ早く終了します。この場合、空の文字列を返します-キーまでのすべてが含まれますが、Returnキーは含まれません。

ユーザーがすぐに を押したかどうかを確認するには、空の文字列と比較する必要がありますReturn

read -n1 KEY
if [[ "$KEY" == "" ]]
then
  echo "@@@";
fi
于 2010-04-10T04:50:27.033 に答える