Linux Shell编程学习笔记(2015-7-20)
分类:linux shell
一:shell函数
同大多数高级语言一样,在shell脚本中可以定义并调用函数。函数的定义格式为:
[function] 函数名()
{
命令表
}
在shell中函数必须先定义再使用。函数定义之后可以被调用任意多次。调用函数时,直接使用函数名,不必带上圆括号,就像使用命令一样。调用函数不会产生新的进程,而是在shell脚本所属的进程内执行。
shell脚本可以利用位置变量向函数传递数据。另外,在函数体内可以访问脚本中任何定义在函数外面的变量,但是不能访问其它函数内用local关键字定义的局部变量。通常,函数中最后一个命令执行完之后,函数即退出。也可以使用return命令在任意位置退出函数(与C语言是类似的)。
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat shellFunction.sh
#! /bin/bash
output()
{
echo "--------------------"
echo $a $b $c
echo $1 $2 $3
echo "--------------------"
}
input()
{
local y
echo "Please input value of x and y"
read x y
}
a="Working directory"
b="is"
c=`pwd`
output You are welcome
x=
input
echo "Value of x is $x, value of y is $y"
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./shellFunction.sh
--------------------
Working directory is /home/biantiao/sh
You are welcome
--------------------
Please input value of x and y
2 3
Value of x is 2, value of y is
biantiao@lazybone1994-ThinkPad-E430:~/sh$ source shellFunction.sh
--------------------
Working directory is /home/biantiao/sh
You are welcome
--------------------
Please input value of x and y
2 3
Value of x is 2, value of y is
biantiao@lazybone1994-ThinkPad-E430:~/sh$
说明:由于y是一个由local声明的局部变量,在函数体外不具有可见性,因此最后输出的y为空。
二:shell内部命令
迄今为止,接触过了许多shell内部命令,这里再介绍几个重要的shell内部命令。
eval命令
格式:
eval [参数]
eval命令会首先扫描参数,所有的参数被读取并连接成一个字符串,然后eval再将该字符串当成命令来执行。例如:
biantiao@lazybone1994-ThinkPad-E430:~/sh$ var="wc -l for1.sh"
biantiao@lazybone1994-ThinkPad-E430:~/sh$ eval $var
11 for1.sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$
exec命令
格式:
exec [arg...]
它在本shell中执行由参数arg指定的命令,该命令将替代本shell进程,即执行命令后命令行shell将不复存在,命令退出整个shell就退出了。
readonly命令
格式:
readonly [name...]
readonly命令给定的name(变量名)是只读的,如果没有给定参数,则列出所有只读变量的清单。使用readonly标记变量等价于使用了declare -r标记。
trap命令
格式:
trap [arg] [n]...
arg是当shell收到信号n时所读取并执行的命令。当设置trap时,arg被扫描一次。在trap被执行时,arg也被扫描一次。所以通常用单引号把arg对应的部分括起来。trap命令可用来设定接收到某个信号所完成的动作,忽略某个信号的影响或者恢复信息产生时系统的预设动作。
trap命令按信号的顺序执行。允许的最高信号码是16.试图对当前shell已忽略的信号设置trap无效;试图对信号11(内存故障)设置trap,则产生错误。trap命令有以下几个常用的用法:
- 为某些信号指定处理的方式。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ trap 'echo "breaking signal got" > ~/exit.txt' 0 1 2 3 15
说明:当shell脚本收到信号0(从shell退出),信号1(挂起),信号2(中断),信号3(退出)或信号15(过程结束)时,都将执行由单引号括起来的命令,即在家目录下创建一个exit.txt文件,其中记录了接收到信号的提示和时间。
- 指定arg为空串以忽略信号。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ trap 0 1 2 3 15
说明:本设置忽略所有的0 1 2 3 15信号。
- 不指定arg,把所有的信号的动作恢复到原来系统默认的动作。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ trap 0 1 2 3 15
wait命令
格式:
wait [n]
wait命令等待进程ID为n的进程终止,并报告终止状态,如果没有指定n,则等待当前所有的活动的子进程终止。wait命令的返回码始终是0。