快捷搜索:   nginx

Shell高级编程(3)


then
return 0
elif [[ 'expr $1%100' -ne 0 || 'expr $1%400' -eq 0 ]]
then
return 1
else
return 0
fi
}
 
shell函数也可以提供参数,而函数则可以处理传递给自己的参数。如上例我们使用:leap-year 2008
 
函数也可以在shell脚本中定义,在脚本中执行,最后随脚本的终止而取消。函数的定义必须位于调用的函数的语句之前。函数名不能与变量同名,如果函数名与已声明的变量名同名,shell将会给出一个出错信息。
 
无论何时调用函数,将会重新设置当前shell进程使用的位置参数,当调用的函数时提供的参数成为新的位置参数。即shell将使用调用函数时提供的参数重新为位置参数赋值。函数按位置引用传递给自己的参数$1、$2、...如果调用函数时未提供参数,位置参数将被清除。
 
shell脚本通常只传递参数给函数。如果把变量名作为参数传递给函数,函数将把变量名作为字符串常量进行处理。
 
13、并列结构
 命令的逻辑与(&&)并列结构和逻辑或(||)并列结构提供一种依次执行一系列命令方法,能有效的替代复杂的if/then语句结构,甚至case语句结构。
逻辑与并列结构的语法格式:
command-1 && command-2 &&command-3 .......
命令的逻辑与并列结构表示从第一个命令的开始,依次执行每个命令。如果当前命令的返回值为0,则继续执行下一个命令。如果中间某个命令的返回值为非零,则整个命令链的执行结束。
 
逻辑或并列结构的语法格式:
command-1 || command-2 || .....
它与逻辑与的并列结构相反,命令的逻辑或并列结构意味着从第一个命令开始,依次执行每一个命令,如果当前命令的返回值为非0,则继续执行下一个命令如果某个命令的返回值为0,则整个命令链的执行结束。
 
14、数组
 同普通变量一样,数组元素可以采用variable[n]=value的形式进行赋值或初始化。为了引用数组的内容,可以使用${variable[n]}的变量替换形式。
 
为了引入数组,在korn Shell中,我们可以使用下列set -A arrayname语句:
set -A arrayname element1 element2.....elementN
如:set -a weekday Sunday Monday Tuesday Wednesday Thursday Friday Saturday
 
在Bash中,可以采用显示的delare -a variable语句引入整个数组。
如:declare -a weekday
weekday[0]=Sunday
weekday[1]=Monday
....
输出数组中的所有元素:${weekday[@]}
使用#字符求取整个数组有多少个元素:echo ${#weekday[@]}或echo ${#weekday[*]}
还可以使用#号求取数组元素的长度:echo ${#weekday[0]},将输出6。
 
unset命令可以删除数组元素,甚至整个数组。如:
unset weekday[1],将去除weekday[1]的值。
unset weekday,将去除数组weekday所有元素的值。
 
通过赋值语句可以实现数组的复制,如:
array2="${array1[@]}"或array2=("$array1[@]}")
 
15、信号捕捉处理
 信号是一种影响进程运行状态的外部事件,是由用户终端、操作系统内核或其他进程发送给指定进程的消息,用于通知进程某种事件已经发生。
 
shell脚本中,trap命令用于指定需要捕捉的信号以及应采取的相应的处理动作。trap命令的语法格式:
trap ["command-list"] [signal...]或trap ['comand-list'] [signal...]
命令是无论何时收到指定的信号时都应当执行的命令或一组命令。一旦命令运行结束,程序的控制逻辑将恢复到因受到信号而中断的位置开始继续执行。通常指定的命令并非单个命令,而是一组命令,前后以单引号、双引号括起来,中间使用分号隔开。
 
shell脚本中,只有0、1、2、3、15、16、17等信号能够捕捉:
0,EXIT ,进程结束信号。无论何时执行exit语句,即可产生此信号,即使没有明显的执行exit语句,脚本运行正常结束也可产生此信号。仅当脚本运行结束时才能执行相应的例行处理动作。
1,HUP,(终止进程)终端通信连接断开时产生的信号。通常,一旦捕捉到此信号,shell脚本将会立即停止运行,除非使用nohup命令
2,INT,(终止进程)按下中断键(Delete键或Ctrl-c键)时产生的信号。
3,QUIT,(终止进程,生成内存映像文件),按下Quit键(Ctrl+\键)时产生的信号。
9,KILL,(终止进程)不可捕捉或忽略的kill信号,供系统管理员使用kill命令终止任何进程。
12,SYS,(终止进程,生成内存映像文件)发现非法系统调用时产生的信号。
15,TERM,(终止进程)终止信号。这是kill命令产生的默认终止信号。
 
shell脚本中,有4个信号不应捕捉:其中信号9和23是不能捕捉的,而信号18和19则不应捕捉。
 
例:
#!/usr/bin/ksh
trap 'echo "variable setting--\na=$a\nb=$b"' EXIT
echo "This line will print before the \"trap\" statement"
echo "even though the \"trap\" statement occurs first"
a=''''
b=36
exit 0
 
如果没有指定任何命令或明显地指定作一个null值,则表示忽略指定的信号。如:
trap '' 2 或trap ':' 2 3,注意trap之后是两个单引号。
 
在trap语句中省略command-list,shell将按默认的处理动作执行。如:trap 1 2 3

顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论