用于捕获所有中断的bash脚本

时间:2016-04-18 21:09:40

标签: bash

所以我在课堂上进行简单的实验练习。写入和中断/信号陷阱程序。该程序将提示用户猜测祖母的年龄。用户可以尽可能多地猜测。当用户输入正确的答案时,没有什么能够终止此程序的执行。 所以我的问题是这个。我已经捕获了ctrl_c但是有一些“技巧”或命令我可以用来捕获所有中断,或者我只需要为我想要捕获的每个信号做一个声明。

age=88

trap ctrl_c INT

function ctrl_c()
{
echo "**Trapped CTRL-C"

}

while [ 1 ]

do

echo "Please enter Grandmothers age. "
read ageGuess
echo $ageGuess
if [ $ageGuess == $age ]
then
    echo "Exiting!"
    exit
fi

完成

1 个答案:

答案 0 :(得分:1)

Afaik trap xxx INT应该足够了,你可以阅读更多herehere,我会提到一些关于你的脚本的事情:

测试命令([)使用=来比较两个字符串,而不是==

除非你确定如果没有引用它们会发生什么,你应该双引所有的变量,考虑一下:

a=a
b=a
# This will work since `$a` and `$b` contains a value
if [ $a = $b ]; then 
  echo hello
fi

这将失败,因为$ c为空,语句将评估为:if [ = ]; then

if [ $c = $d ]; then
  echo fail 
fi

您应该在while循环中使用true:

while :; do

您通常应始终在-r中使用read,并记住shebang:

#!/bin/bash
age=88

trap ctrl_c INT

ctrl_c() {
  echo "**Trapped CTRL-C"
}

while :; do
  echo "Please enter Grandmothers age. "
  read -r ageGuess
  echo "$ageGuess"
  if [ "$ageGuess" = "$age" ]; then
    echo "Exiting!"
    exit
  fi
done

实际上,代码现在可以使用#!/bin/sh,因为它与POSIX兼容。

请注意,您可能希望使用printf "%s\n" "$user_input"代替echo "$user_input"