Shell编程中关于信号捕获的”--“符号和新建函数体空格的问题讨论

101 阅读3分钟

最近在学习《Linux命令行和shell脚本编程大全》(第四版)这本书,对于自己遇到的问题以及通过搜索引擎和书籍中的解决方案进行一个案例的剖析,希望对于像我这样的初学者,有一个帮助。

1 关于信号捕获 trap -trap --

在第16章 《脚本控制》的16.1.5节中关于修改或移除信号捕获中有如下描述:

恢复默认trap.png

那么我在复述该脚本的时候,如下:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# cat trapremoval.sh 
 #!/bin/bash
 trap "echo ' Sorry ...CTRL C is trapped.'" sigint
 count=1
 while [ $count -le 5 ]
 do
     echo "#Loop $count."
     ((count+=1))
     sleep 3
 done
 trap -- sigint
 echo "The trap is been removed."
 cnt=1
 while [ $cnt -le 3 ]
 do
     echo "Second loop $cnt"
     ((cnt+=1))
     sleep 3
 done
 exit

结果:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# sh trapremoval.sh 
 #Loop 1.
 ^C Sorry ...CTRL C is trapped.
 #Loop 2.
 #Loop 3.
 #Loop 4.
 #Loop 5.
 trap: usage: trap [-lp] [[arg] signal_spec ...]

仔细看脚本,对照书中的例子,其实并没有犯任何的错误,但确实是报trap:usage...错误,很奇怪。不经意间,我将脚本中的 -- 修改为 - ,发现脚本正常运行:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# sh trapremoval.sh 
 #Loop 1.
 ^C Sorry ...CTRL C is trapped.
 #Loop 2.
 #Loop 3.
 ^C Sorry ...CTRL C is trapped.
 #Loop 4.
 #Loop 5.
 The trap is been removed.
 Second loop 1
 ^C

这里其实说明两个问题:

  • 利用trap取消信号捕获的设置时,可能不同系统有不同的模式,--以及-都是可以的
  • 关于信号的描述SIGINT不区分大小写,大写也可,小写也会正常捕获。

2 关于新建函数空格的问

在17章,17.2.1节,讲述函数如何构建,主要有两种方式,其实跟其他编程方式类似,如下:

 # 方法一
 function funcname {
     函数体
 }
 # 方法二
 funcname() {
     函数体
 }

以下是我的复述的例子:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# cat func_status2.sh 
 #!/bin/bash
 function db1{
     read -p "Enter a number:" value
     echo "Double the value:"
     return $[ $value * 2 ]
 }
 ​
 db1
 echo "The new value is $?"

运行结果如下:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# sh func_status2.sh 
 func_status2.sh: line 3: syntax error near unexpected token `read'
 func_status2.sh: line 3: `  read -p "Enter a number:" value'

这个错误的报错让人以为是read命令的错误使用,经过核查也没有问题,仔细对照函数构建方式,将第三行由function db1{ 修改为 function db1 },再次运行:

 [root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# sh func_status2.sh 
 Enter a number:24
 Double the value:
 The new value is 48

发现结果正确,这里说明:

  • 函数名与函数体的{之间要有空格分隔

3 小结

上述两个例子,是我个人在学习的过程中遇到的,可能新手学习的时候也会有类似的苦恼。问题其实就是很小,可能是由于系统版本的差异造成脚本的语法不一致,可能仅仅是我们遗漏了最简单的地方,造成程序无法运行,希望读到这儿的您也有所收获。