前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux编程中关于信号捕获“--”和新建函数体空格的问题讨论

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

原创
作者头像
哎呀_编号89757
发布2024-09-13 09:26:19
1200
发布2024-09-13 09:26:19
举报
文章被收录于专栏:Shell编程读书笔记

最近在学习《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...错误,很奇怪。不经意间,我将脚本中的 --修改为 - ,发现脚本正常运行:

代码语言:shell
复制
[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 },再次运行:

代码语言:shell
复制
[root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# sh func_status2.sh 
Enter a number:24
Double the value:
The new value is 48

发现结果正确。

3 小结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 关于信号捕获 trap - 与 trap --
  • 2 关于新建函数空格的问题
  • 3 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档