最近在学习《Linux命令行和shell脚本编程大全》(第四版)这本书,对于自己遇到的问题以及通过搜索引擎和书籍中的解决方案进行一个案例的剖析,希望对于像我这样的初学者,有一个帮助。
1 关于信号捕获 trap -
与 trap --
在第16章 《脚本控制》的16.1.5节中关于修改或移除信号捕获中有如下描述:
那么我在复述该脚本的时候,如下:
代码语言:shell复制[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
结果:
代码语言:shell复制[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节,讲述函数如何构建,主要有两种方式,其实跟其他编程方式类似,如下:
代码语言:shell复制{
# 方法一
function funcname {
函数体
}
# 方法二
funcname() {
函数体
}
以下是我的复述的例子:
代码语言:shell复制[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 $?"
运行结果如下:
代码语言:shell复制[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 小结
上述两个例子,是我个人在学习的过程中遇到的,可能新手学习的时候也会有类似的苦恼。问题其实就是很小,可能是由于系统版本或者一些细节的问题造成脚本报错,可能仅仅是我们遗漏了最简单的地方,造成程序无法运行,希望读到这儿的您也有所收获。