2010-04-10 1 views
12

Tôi cần phải so sánh đầu vào của tôi với Nhập/Return chìa khóa ...Bash Shell Scripting - chìa khóa trở lại/phím Enter

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

Nhưng đây không phải đang làm việc .. Điều gì là sai với mã này

+1

Bạn đang thiếu "then" trên dòng giữa "if" và "echo". Không phải là vấn đề duy nhất, nhưng một số – Phil

Trả lời

28

Một số vấn đề với mã đã đăng. bình luận Inline chi tiết những gì để sửa chữa:

#!/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 đọc một dòng từ đầu vào tiêu chuẩn, nhưng không bao gồm dòng mới ở cuối dòng. -n chỉ định số ký tự tối đa, buộc read trả lại sớm nếu bạn đạt đến số ký tự đó. Tuy nhiên, nó sẽ vẫn kết thúc sớm hơn khi nhấn phím Quay lại. Trong trường hợp này, nó trả về một chuỗi rỗng - mọi thứ có thể nhưng không bao gồm phím Trả về.

Bạn cần so sánh với chuỗi trống để cho biết liệu người dùng có ngay lập tức nhấn Trả lại hay không.

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

Ngoài ra nó là ý tưởng tốt để xác định IFS $ rỗng (tách lĩnh vực nội bộ) trước khi đưa ra so sánh, bởi vì nếu không bạn có thể kết thúc với "" và "\ n" là như nhau.

Vì vậy, các mã nên trông như thế này:

# 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

# điều này không hoạt động đối với tôi nếu sử dụng coutdown in vòng lặp IFS = echo -e "Nhấn [ENTER] Cho Cấu hình Bàn phím." cho ((i = 10; i> 0; i--)); làm printf "\ rBắt đầu sau $ i giây ..." đọc -n 1 -t 1 khóa nếu ["$ key" = $ '\ e']; sau đó echo "Đây là ESC" nghỉ elif [ "$ key" == ""]; sau đó vang -e "\ n gian được nhấn" nghỉ fi làm –

+0

có lẽ điều này là cho các cú pháp inline bạn nên sử dụng IFS =; echo ... (với dấu chấm phẩy) – tsds

0

tôi thêm mã dưới đây chỉ để tham khảo nếu ai đó sẽ muốn sử dụng giải pháp như vậy có chứa vòng lặp đếm ngược.

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