我对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上的第一篇文章,实际上。 谢谢!
答案 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