Bash - 使用Ctrl-C中断循环但继续使用脚本

时间:2017-10-18 18:29:48

标签: bash

我有一个无限的while循环,如果用户按下Ctrl-C,我只想突破。

但是我的while循环中有2个计数器,当我退出while循环时,我想要打印出它的值。

OK_COUNT=0
NOK_COUNT=0

while :
  do
    RESULT=`curl -s http://${IP}${ENDPOINT} --max-time 1`

      if [ $RESULT == '{"status":"UP"}' ]
        then
           (( OK_COUNT+=1 ))
           echo "`date` :: ${ENDPOINT} is OK ! Total count is $OK_COUNT "
        else
           (( NOK_COUNT+=1 ))
           echo "`date` :: ${ENDPOINT} is UNREACHABLE ! Total count is $NOK_COUNT"
      fi

    sleep 0.5
  done

echo $OK_COUNT
echo $NOK_COUNT

现在,当我按下Ctrl + C时,我退出while循环并退出脚本。这意味着最后2个echo语句不能打印出来。

有没有办法,如果我按Ctrl + C,我只退出while循环,但其余的脚本仍然运行?

编辑/解决方案::

添加trap后,它有效!

OK_COUNT=0
NOK_COUNT=0

trap printout SIGINT
printout() {
   echo $OK_COUNT
   echo $NOK_COUNT
   exit
}

while :
  do
    RESULT=`curl -s http://${IP}${ENDPOINT} --max-time 1`

      if [ $RESULT == '{"status":"UP"}' ]
        then
           (( OK_COUNT+=1 ))
           echo "`date` :: ${ENDPOINT} is OK ! Total count is $OK_COUNT "
        else
           (( NOK_COUNT+=1 ))
           echo "`date` :: ${ENDPOINT} is UNREACHABLE ! Total count is $NOK_COUNT"
      fi

    sleep 0.5
  done

使用上面的代码,当我用Ctrl + C退出代码时,我得到了。

Wed Oct 18 18:59:13 GMT 2017 :: /cscl_etl/health is OK ! Total count is 471 
Wed Oct 18 18:59:13 GMT 2017 :: /cscl_etl/health is OK ! Total count is 472 
^C
5
0
# 

1 个答案:

答案 0 :(得分:5)

陷阱声明

这是一种确保在 Ctrl + C 之后运行echo语句的方法:

trap printout SIGINT
printout() {
    echo ""
    echo "Finished with count=$count"
    exit
}
while :
do
    ((count++))
    sleep 1
done

按下 Ctrl + C 时,此脚本的输出如下所示:

$ bash s.sh
^C
Finished with count=2

如何运作

trap语句捕获 Ctrl + C 并执行函数printout。该功能可以包括您喜欢的任何声明。

带陷阱的子shell

或者,我们可以将循环和陷阱语句放在子shell中:

$ cat t.sh
(
    trap printout SIGINT
    printout() {
        echo ""
        echo "At end of loop: count=$count"
        exit
    }
    while :
    do
        ((count++))
        sleep 1
    done
)
echo "Finishing script"

当它运行并按下 Ctrl + C 时,输出如下:

$ bash t.sh
^C
At end of loop: count=2
Finishing script

此方法允许我们在子shell后继续使用脚本。但是请注意,在子shell退出后,子shell中所做的任何变量设置或其他环境更改都会丢失。