最近在学习《Linux命令行和shell脚本编程大全》(第四版)这本书,对于自己遇到的问题以及通过搜索引擎和书籍中的解决方案进行一个案例的剖析,希望对于像我这样的初学者,有一个帮助。
trap -
与 trap --
在第16章 《脚本控制》的16.1.5节中关于修改或移除信号捕获中有如下描述:
那么我在复述该脚本的时候,如下:
[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
这里其实说明两个问题:
--
以及-
都是可以的SIGINT
不区分大小写,大写也可,小写也会正常捕获。在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
发现结果正确。
上述两个例子,是我个人在学习的过程中遇到的,可能新手学习的时候也会有类似的苦恼。问题其实就是很小,可能是由于系统版本或者一些细节的问题造成脚本报错,可能仅仅是我们遗漏了最简单的地方,造成程序无法运行,希望读到这儿的您也有所收获。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。