Bash:使用`read`捕获换行符

时间:2014-01-09 02:25:23

标签: bash

我有一个循环,我想打破任何用户输入。

Contrived example - 从10开始倒计时的计时器:

counter=10
while (( counter > 0 )) && [[ -z $input ]]; do
    printf '\rRestart in %s seconds' "$counter"
    read -n 1 -t 1 input
    (( counter-- ))
done
echo "Completed"

这适用于除Enter 之外的所有用户输入,我完全期望Enter将是最常见的输入。

如何使用Bash的Enter命令捕获read

2 个答案:

答案 0 :(得分:4)

bash手册说read返回成功(返回代码为零),除非它超时。那怎么样:

for (( counter=10 ; counter > 0 ; counter-- )); do
    printf "\rRestart in %s seconds " $counter
    read -n 1 -t 1 input && break
done
echo "Completed"

答案 1 :(得分:2)

告诉读取使用NUL作为其分隔符:

IFS='' read -r -d '' -n 1 -t 1 input

所以,在完整的背景下:

counter=10; input=''
while (( counter > 0 )) && [[ -z $input ]]; do
    printf "\rRestart in %s seconds" "$counter"
    IFS='' read -n 1 -t 1 -d '' input
    (( counter-- ))
done