2014-01-09 84 views
0

我有一个循环,我想打破任何用户输入。Bash:用`read`捕获换行符

人为的例子 - 计数到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的read命令捕获Enter

+0

修复了语法 - 给定的示例代码实际上并没有工作 - 也使它遵循一些约定。 –

+0

@CharlesDuffy谢谢! –

+0

我错过了第一遍格式化/约定修正中的主要内容 - 在printf的第一个参数中不应该使用参数扩展(因为它可能会导致格式字符串无效)而不会出现情有可原的情况。在随后的传球中补丁。 –

回答

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 
+0

这回答了我很多其他问题。谢谢! –

4

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

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

+1我的想法正确 –

+0

+1 - 这是比我提供的OP更真实的解决方案。另一方面,它并没有实际演示如何通过阅读来捕获换行符,这是别人谁点击搜索结果可能需要回答的问题,所以我倾向于打电话给接受答案国旗正确授予。 :) –

+0

...有一些小问题,第二次看 - “计数器”与“COUNTER”,这保留了在格式字符串中执行字符串替换的先前代码中的错误做法。 –