存储击键bash

存储击键bash,bash,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。下面是我希望的代码(显然缺少注册击键然后中断循环所需的代码): 请随时纠正

我对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。下面是我希望的代码(显然缺少注册击键然后中断循环所需的代码):

请随时纠正我,如果有什么似乎是错误的,以及-这是我的第一篇关于stackoverflow的文章,实际上。
谢谢

因此,如果您想在输入所有要求和的数字后,找到打破循环的方法,可以使用
trap
命令


如果您是bash编程新手,它是一个捕获信号(如Ctrl+c)并执行另一个例程的命令。在这种情况下,您可能会执行一个
break
-type命令。

您不想使用
ctrl+d
,这实质上意味着
EOF
或“不再输入”,这将导致shell断开连接。正如您所发现的,大多数信号都与
kill
一起使用,并且需要使用
trap
功能,这不是您想要的。(您可以使用陷阱,但它将结束您的脚本)。为什么不利用bash中变量不是
类型的这一事实,简单地选择一些值或单词来打破循环呢?可以编辑您的第一个脚本以提供:

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

while read addition; do
    [ "$addition" = "done" ] && break
    let sum=sum+addition
done
echo "$sum"
手动执行脚本时,完成后,只需键入“done”或您选择的任何内容。例如:

$ ./script.sh
10
10
10
15
done
45
如果您通过
cat
向stdin提供带有编号的文件,脚本将自动退出并提供
sum
。例如(在单独的行中使用相同的编号):


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

#!/bin/bash

sum=0
count=0
while read -r addition && (( ++count < 5 )); do
   (( sum += addition ))
done
echo "$sum"
#/bin/bash
总和=0
计数=0
而read-r加法&(++count<5));做
((总和+=加法))
完成
回音“$sum”
这将在读取5次后或
read
的退出代码为非零时终止(Ctrl-d将执行此操作)

关于你所做的几点:

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

好的,谢谢-我会注意declare-I和(())语法:)没问题。顺便说一句,除非你需要进一步澄清,否则你应该接受你最喜欢的答案(不一定是这个!),这样你的问题就被标记为已解决。使用
declare-i sum
可以编写
sum+=addition
,而无需用算术命令包装它。没有更好或更糟,只是不同。
(…)
更一般,所以我从来没有真正看到在公认的答案下面使用
declare-I
:)@Superdids NB的意义。就我个人而言,使用Ctrl-d来打破循环(如我的回答中所述)实际上是一个好主意,因为它达到了预期的目的。Ctrl+d基本上是一个建议,只是找到一个合适的键作为示例并不容易,因为在bash编程方面缺乏经验!是的,我会,我自己,简单地用一个值来打破这个循环-我只是好奇,事实上。你有很好的同伴。我已经做了几十年了,在bash中捕获一个键来完成输入总是需要一个创造性的修复。您可以生成的任何信号,例如SIGHUP、SIGINT等。。需要使用
kill
进行捕获和管理。与其说“完成”,不如说它是大写的
C
——至少你会有一种捕捉信号的感觉:)很好,谢谢!我现在有一些阅读和编码工作要做,似乎^^ Control-D只会在shell提示符下键入shell时导致shell退出,因为您正在结束shell用于标准输入的文件。当
read
命令等待输入时键入它,只会导致
read
以非零状态退出。
$ cat somefile.txt | ./script.sh
45
#!/bin/bash

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