1、第四章 shell程序设计,4.1 shell 概 述,命令解释程序 高级程序设计语言,第一个bash程序,#!/bin/bash# 这个程序将打印“Hello World”到屏幕上echo “Hello World“ $ chmod u+x ./hello.sh $ ./hello.sh,更有用的程序,$ mkdir trash$ mv * trash$ rm -rf trash$ mkdir trash #!/bin/bashmkdir trashmv * trashrm -rf trashmkdir trashecho “Deleted all files!“,注释,以“#”开头 第一行
2、(“#!/bin/bash”)除外,4.2 shell 变 量,所有变量的取值都是一个字符串 可以现定义、现赋值 例子:#!/bin/bashx=12echo “The value of variable x is $x“,使用shell变量,shell变量的变量名是以字母或下划线开头的字母、数字和下划线的字符序列,字母区分大小写。 定义变量并赋值的一般形式是:变量名=变量值 用$var的形式来引用名为var的变量的值,两种shell变量,环境变量:永久性变量,其值不会随shell程序执行结束而消失。 本地变量:在shell程序内部定义的,其使用范围仅限于定义它的程序,出了程序就不能再用,使用
3、shell变量(深入),设置一个变量只读:readonly 变量名 将一局部变量提供给shell执行的其他命令使用:export 变量名,4.3 控 制 性 结 构,if语句 while语句 until语句 for语句 case语句,4.3.1 if语句,基本格式是:if 命令then命令组1else命令组2fi,例子,#!/bin/bashif test -f /etc/foothen# 文件存在,则拷贝文件然后打印出一个信息cp /etc/foo .echo “Done.“else# 文件不存在,则打印出一个信息然后离开echo “This file does not exist.“exi
4、tfi,test命令,-d 检查此file是否是一个目录-e 检查此file是否存在-f 检查此file是否为一般的文件-g 检查此file是否有SGID权限-r 检查此file是否可以读取-s 检查此file大小是否不为0-u 检查此file是否有SUID权限-w 检查此file是否可以写入-x 检查此file是否可以执行,test的另外写法,if test -f /etc/foothen if -f /etc/foo ; then,4.3.2 while语句,语法格式 while 命令 do 命令组 done,例子,#!/bin/bashwhile true; do # while :;
5、doecho “Press CTRL-C to quit.”done #!/bin/bashx=0; # 设定 x 初值为 0while “$x“ -le 10 ; doecho “Current value of x: $x“# 增加 x 的数值:x=$(expr $x + 1)sleep 1done,检查条件,检查在数值之间的比较:x -eq y 检查x和y是否相等x -ne y 检查x和y是否不相等x -gt y 检查x是否大于yx -lt y 检查x是否小于y 检查在字符串之间的比较:x = y 检查x与y是否相同x != y 检查x与y是否不相同-n x 若x不是空字符串(null)
6、则为真-z x 若x是空字符串(null) 则为真,4.3.3 until语句,命令格式 until 命令 do 命令组 done,例子,#!/bin/bashx=0until “$x“ -ge 10 ; doecho “Current value of x: $x“x=$(expr $x + 1)sleep 1done,4.3.4 for语句,for语句的结构是: for 变量 in 参数1 参数2 参数n do 命令组 done,例子,#!/bin/bashecho -n “Checking system for errors”for dots in 1 2 3 4 5 6 7 8 9 1
7、0; doecho -n “.”echo “System clean.”done #!/bin/bashfor x in paper pencil pen; doecho “The value of variable x is: $x”sleep 1done,更实用的例子,要求:给当前目录里的所有文件加后缀名“ .html”,#!/bin/bash for file in *; doecho “Adding .html extension to $file.”mv $file $file.htmlsleep 1 done,4.3.5 case语句,语法格式: case 变量 in 模式 1)
8、命令组1; 模式 2) 命令组2; 模式 n) 命令组n esac,例子,#!/bin/bashx=5 # 设定 x 初值为5# 现在检查 x 的数值:case $x in0) echo “Value of x is 0.”;5) echo “Value of x is 5.”;9) echo “Value of x is 9.”;*) echo “Unrecognized value.”esac,4.4 引 号,双引号(double quote) ” 单引号(forward quote) 反单引号(back quote) ,双引号,$ mkdir hello world$ mkdir “he
9、llo world”,单引号,例:#!/bin/bashx=5 # 设定 x 初值为 5# 使用双引号echo “Using double quotes, the value of x is: $x”# 使用单引号echo Using forward quotes, the value of x is: $x,反单引号,例:x=$(expr $x + 1)x=expr $x + 1,4.5 算 术 运 算,expr命令 $(.) 例子:#!/bin/bashx=8 # 设定x初值为8y=4 # 设定y初值为4# 现在我们将x和y的总合之值设定到z:z=$($x + $y)echo “The s
10、um of $x + $y is $z”,其它运算,运 算 运算符Addition /加 +Subtraction / 减 -Multiplication / 乘 *Division / 除 /Modulus / 取余 %,4.6 读取使用者输入,read命令 例子:#!/bin/bash# 取得到使用者的名字,打印出问候语echo -n “Enter your name:”read user_nameecho “Hello $user_name!”,4.7 函 数,#!/bin/bash# 函数 hello() 只是打印出一个信息hello()echo “You are in functio
11、n hello()”echo “Calling function hello().”# 调用 hello() 函数:helloecho “You are now out of function hello()”,4.8 TRAPPING,trap使用下列的语法:trap action signal 信号量1)SIGHUP2)SIGINT 3)SIGQUIT 9)SIGKILL15) SIGTERM,例子,#!/bin/bash# 使用trap命令 # trap CTRL-C执行sorry()函数:trap sorry INT # 函数sorry()打印出一个信息sorry()echo “Im
12、sorry Sir. I cant do that.”sleep 3# 从 10 数到 1:for i in 10 9 8 7 6 5 4 3 2 1; doecho “$i seconds until system failure.”sleep 1doneecho “System failure.”,4.9 AND & OR,条件1 thenecho “Both conditions are true.”elseecho “The conditions are not true.”fi,4.10 使 用 参 数,$0 $9 $# #!/bin/bash# 打印第一个参数# 首先检查是否有一个
13、参数:if “$#” -ne 1 ; thenecho “usage: $0”fi echo “The argument is $1”,4.11 临 时 文 件,“ $”符号 $ touch hello.$,4.12 返 回 值,$? 变量 例子#!/bin/bash# grep 使用者 foobar,并用导引所有输出到/dev/null:grep “foobar” /dev/null 2 thenecho “Match found.”exitelseecho “No match found.”fi,用户程序返回值的例子,例: #!/bin/bash if -f “/etc/passwd” ;
14、 thenecho “Password file exists.”exit 0 elseecho “No such file.”exit 1 fi,函数返回值的例子,check_passwd() # 检查是否passwd文件存在: if -f “/etc/passwd” ; then echo “Password file exists.” # 有找到,传回一个0值: return 0 else # 找不到,传回一个1值: echo “No such file.” return 1 fi ,# 从函数check_passwd取得返回值: foo=check_passwd # 检查数值: if “$foo” -eq 0 ; then echo “File exists.” exit 0 else echo “No such file.” exit 1 fi,