存储击键bash

时间:2014-09-10 08:01:11

标签: bash

我对bash编程很新,说我有这个代码:

#!/bin/bash
declare -i sum=0
declare -i count=0

while [ $count -lt 5 ]; do
read addition
let sum=sum+addition
let count++
done
echo "$sum"  

其中基本上将读取输入加在一起5次。相反,我希望它能够这样做,直到我使用特定的击键,如ctrl + d。下面是代码(显然缺少注册键击所需的代码,然后打破循环)我希望:

#!/bin/bash
declare -i sum=0

while true; do
read addition
let sum=sum+addition
if [ ]; then #what should I insert, do I need additional lines to register keystrokes?
break;
fi
done
echo "$sum"

如果出现问题,请随时纠正我 - 这是我在stackoverflow上的第一篇文章,实际上。 谢谢!

3 个答案:

答案 0 :(得分:1)

就我个人而言,我会写下你想要做的事情:

#!/bin/bash

sum=0
count=0
while read -r addition && (( ++count < 5 )); do
   (( sum += addition ))
done
echo "$sum"

这将在5次读取后或read的退出代码非零时终止( Ctrl - d 将执行此操作)。

关于你做了什么的几点:

  • 没有必要使用declare -i,尤其是在您声明变量时初始化变量时(但我猜它也没有任何损害)
  • let是旧的bash语法,您可以(并且应该)使用更新的(( ))。或者,您可以使用更广泛的兼容性(POSIX兼容)sum=$((sum+1))

答案 1 :(得分:0)

因此,如果您想要输入所有要求总和的数字,那么您可以使用trap命令来摆脱循环。

如果您不熟悉bash编程,那么它将捕获信号(如Ctrl + c)并导致执行另一个例程。在这种情况下,您可能会执行break - 类型命令。

答案 2 :(得分:0)

您不想使用ctrl+d,这意味着基本上是EOF或者不再需要输入&#39;这会导致你的shell断开连接。如您所见,大多数信号与kill一起使用,并且需要使用trap函数,而这不是您想要的函数。 (你可以使用陷阱,但它会结束你的脚本)。为什么不利用bash中变量不是typed的事实,只需选择一些值或单词来突破循环?您可以编辑第一个脚本以提供:

#!/bin/bash
declare -i sum=0

while read addition; do
    [ "$addition" = "done" ] && break
    let sum=sum+addition
done
echo "$sum"

手动执行脚本时,完成后,只需输入&#34; done&#34;或者你选择的任何东西例如:

$ ./script.sh
10
10
10
15
done
45

如果您通过sum向stdin提供带有数字的文件,脚本将自动退出并提供cat。例如。 (在不同的行上具有相同数字的文件):

$ cat somefile.txt | ./script.sh
45