37
第 6 第 shell 第第第第 第第第第第第第第第

第 6 章 shell 程序设计

  • Upload
    quasar

  • View
    171

  • Download
    6

Embed Size (px)

DESCRIPTION

第 6 章 shell 程序设计. 江苏大学计算机学院. 主要内容. Shell 的作用 Shell 程序的编辑和运行 基于 Bash 的 Shell 程序设计 变量声明 表达式 条件判断 控制结构 参数访问 Shell 程序的调试. shell. 操作系统. 硬件. 图形界面. 其它用户界面. Shell 的作用. shell 是用户和系统内核之间的接口程序 shell 是命令解释器 在本章中, shell 指 linux 的终端 即解释用户命令和 shell 程序的文字终端. 用户. linux 下的 shell. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 6 章  shell 程序设计

第 6章 shell程序设计 江苏大学计算机学院

Page 2: 第 6 章  shell 程序设计

2

主要内容Shell 的作用Shell 程序的编辑和运行基于 Bash 的 Shell 程序设计

变量声明表达式条件判断控制结构参数访问Shell 程序的调试

Page 3: 第 6 章  shell 程序设计

3

Shell的作用 shell 是用户和系统内核之间的接口程序 shell 是命令解释器 在本章中, shell 指 linux 的终端即解释用户命令和 shell 程序的文字终端

硬件

shell

操作系统

图形界面

其它用户界面 用户

Page 4: 第 6 章  shell 程序设计

4

linux下的 shell 用户使用 shell 的设定

通过查看 /etc/passwd 文件可以查看用户使用的 shell类型 例子: /etc/passwd 部分节选webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologinxfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologingdm:x:42:42::/var/gdm:/sbin/nologinhtt:x:100:101:IIIMF Htt:/usr/lib/im:/sbin/nologintom:x:500:500:tom:/home/tom:/bin/bashtom:x:500:500:tom:/home/tom:/bin/bash#可见, tom用户使用的 shell为 bash

Page 5: 第 6 章  shell 程序设计

5

linux下的 shell linux 下的 shell

通过 cat /ect/shells 命令查看安装的 shell

shell 及路径

查看 shell 的命令

Page 6: 第 6 章  shell 程序设计

6

shell程序 Shell 程序的特点及用途:

shell 程序可以认为是将 shell 命令按照控制结构组织到一个文本文件中,批量的交给 shell 去执行 不同的 shell 解释器使用不同的 shell 命令语法 shell 程序解释执行,不生成可以执行的二进制文件 可以帮助用户完成特定的任务,提高使用、维护系统的效率 了解 shell 程序可以更好的配置和使用 linux

Page 7: 第 6 章  shell 程序设计

7

基于 bash的 shell程序 简单程序示例

greeting.sh

echo "Programme Ends."12

say_hello11

echo "Programme Starts Here....."

10

}9

echo "Hello $name"8

read name7

echo "Enter Your Name,Please. :"

6

{5

function say_hello()4

#a Function3

#a Simple shell Script Example2

#!/bin/bash1

解释

输出提示,提示程序结束调用函数程序开始的第一条命令,输出提示信息函数结束输出读入用户的输入到变量 name

echo 命令输出字符串函数开始以 functin 开始,定义函数同上以 # 开始,其后为程序注释以 #! 开始,其后为使用的 shell

Page 8: 第 6 章  shell 程序设计

8

基于 bash的 shell程序 程序编译和运行过程

一般步骤:编辑文件保存文件将文件赋予可以执行的权限运行及排错

常用到的命令: vi ,编辑、保存文件 ls -l 查看文件权限 chmod 改变程序执行权限直接键入文件名运行文件或者# bash 文件名

Page 9: 第 6 章  shell 程序设计

9

shell程序的编辑和执行查看权限

查看权限,初始状态无执行( x )权限增加可执行( x )的权限

查看权限,已经具备执行( x )权限运行程序

程序运行过程输出

Page 10: 第 6 章  shell 程序设计

10

shell程序设计 一般结构

shell 类型 函数 主过程

#!/bin/bashfunction fun1(){}......funciton funn(){}.................

函数定义shell 类型

主过程

Page 11: 第 6 章  shell 程序设计

11

变量的声明和使用 变量的声明和使用

变量是弱类型的声明变量不用声明类型可以存储不同类型的内容使用灵活使用时要明确变量的类型大小写区分

变量声明及赋值格式格式:变量=值 (注意:等号两侧不能有空格)例如:a=”hello ”b=9

Page 12: 第 6 章  shell 程序设计

12

变量的声明和使用 变量的引用

格式 :$ 变量名,或者 ${ 变量名 }变量名为一个字符用方式一,变量名多于一个字符建议用第 2 种方式例子:a=1abc="hello"echo $aecho ${abc}

Page 13: 第 6 章  shell 程序设计

13

常用的运算符 整数的算术运算符

+ (加)、-(减)、 * (乘)、 / (除)、 % (取模); 赋值运算符

+=(加等于,在自身基础上加第二个变量) -=(减等于,在第一个变量的基础上减去第二个变量) * =(乘等于,在第一个变量的基础上乘以第二个变量) / =(除等于,在第一个变量的基础上除以第二个变量 ) %=(取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量 )

Page 14: 第 6 章  shell 程序设计

14

常用的运算符 位运算符

<<( 左移)、 >> (右移)、 & (与运算)、 | (或运算)、 ~ (取反)、 ^ (异或运算); 位运算赋值运算符

<< =、 >> =、 & =、 | =、 ~ =、 ^ =; 逻辑运算符:

&& (逻辑与), || (逻辑或), ! (逻辑非), > (大于), > =(大于等于), < (小于), < =(小于等于),!=(不等于),==(等于)

Page 15: 第 6 章  shell 程序设计

15

简单数学表达式 expr 命令计算一个表达式的值

格式 :expr arg 例子:计算( 2 + 3 ) ×4 的值1 、分步计算,即先计算 2 + 3 ,再对其和乘 4s=`expr 2 + 3`expr $s \* 42 、一步完成计算:expr `expr 2 + 3 ` \* 4 说明:

运算符号和参数之间要有空格分开; 通配符号( * ) , 在作为乘法运算符时要用 \ 、“”、‘’符号修饰

Page 16: 第 6 章  shell 程序设计

16

简单数学表达式 let 命令

格式: let arg1 [arg2 ......] 例子:计算( 2 + 3 ) ×4 的值let s=(2+3)*4 说明:

与 expr 命令相比, let 命令更简洁直观 当运算符中有 < 、 > 、 & 、 | 等符号时,同样需要用引号(单引号、双引号)或者斜杠来修饰运算符

Page 17: 第 6 章  shell 程序设计

17

条件判断 常见的条件:

变量属性; 文件属性; 命令执行结果; 多种条件的逻辑组合;

判断结果的一般定义: 真: 0 假: 1

格式: test condition [ condition ]

Page 18: 第 6 章  shell 程序设计

18

条件判断 测试文件属性

常用的文件属性条件判断-f fn 如果 fn 存在且 fn 为普通文件则返回真,否则返回假。-b fn 如果 fn 存在且 fn 为块设备则返回真,否则返回假。-e fn 如果 fn 存在则返回真,否则返回假。-d fn 如果 fn 存在且 fn 为目录则返回真,否则返回假。-r fn 如果 fn 存在且 fn 可读则返回真,否则返回假。-w fn 如果 fn 存在且 fn 可写则返回真,否则返回假。-x fn 如果 fn 存在且 fn 可执行则返回真,否则返回假。-O fn 如果 fn 存在且被当前用户拥有则返回真,否则返回假。-L fn 如果 fn 存在且 fn 为符号链接则返回真,否则返回假。

Page 19: 第 6 章  shell 程序设计

19

条件判断 字符串属性 常用字符串属性条件判断

string_1 = string_2 如果 string_1 和 string_2 两个字符串相等则返回真,否则返回假;string_1 != string_2 如果 string_1 和 string_2 两个字符串不相等则返回真,否则返回假;-z string 如果字符串 string 的长度为 0 则返回真,否则返回假;-n string 如果字符串 string长度不为 0 则返回真,否则返回假;string 同 -n string ,如果字符串 string长度不为0 返回真,否则返回假。

Page 20: 第 6 章  shell 程序设计

20

整数关系 整数间关系判断 常用的整数关系条件判断mum_1 –eq num_2 如果 num_1 和 num_2 相等则返回真,否则返回假;mum_1 –ne num_2 如果 num_1 不等于 num_2 则返回真,否则返回假;mum_1 –gt num_2 如果 num_1 大于 num_2 则返回真,否则返回假;mum_1 –lt num_2 如果 num_1 小于 num_2 则返回真,否则返回假;mum_1 –le num_2 如果 num_1 小于等于 num_2 则返回真,否则返回假;mum_1 –ge num_2 如果 num_1 大于等于 num_2 则返回真,否则返回假;

Page 21: 第 6 章  shell 程序设计

21

控制结构 控制结构:根据某个条件的判断结果,改变程序执行的路径。可以简单的将控制结构分为分支和循环两种 。 常见分支结构:

if case

常见循环结构: for while until

Page 22: 第 6 章  shell 程序设计

22

if分支 格式: 说明:

中括号中的部分可省略; 当条件为真( 0 )时执行 then后面的语句,否则执行 else后面的语句; 以 fi 作为 if 结构的结束。

if 条件 1then命令[elif 条件 2

then命令 ][else命令 ]fi

Page 23: 第 6 章  shell 程序设计

23

case分支 格式: 说明:

“条件”可以是变量、表达式、 shell 命令等; “模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线( | )联结 ; 一个模式要用双分号(;;)作为结束 ; 以逆序的 case 命令( esac )表示 case 分支语句的结束

case 条件 in模式 1)

命令 1;;

[ 模式 2 )命令 2;;

...............模式 n )

命令 n;; ]

esac

Page 24: 第 6 章  shell 程序设计

24

for循环 格式 说明:

“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值; do 和 done 之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次; 如果中括号中的部分省略掉, Bash 则认为是“ in $@” ,即执行该程序时通过命令行传给程序的所有参数的列表。

for 变量 [in 列表 ]do 命令(通常用到循环变量)done

Page 25: 第 6 章  shell 程序设计

25

while循环与 until循环 格式: 说明:

while循环中,只要条件为真,就执行 do 和 done 之间的循环命令; until循环中,只要条件不为真,就执行 do 和 done之间的循环命令,或者说,在 until循环中,一直执行do 和 done 之间的循环命令,直到条件为真; 避免生成死循环。

while/until 条件do

命令done

Page 26: 第 6 章  shell 程序设计

26

函数 格式:

定义:

引用:

说明: 中括号中的部分可以省略; 如果在函数内部需要使用传递给函数的参数,一般用 $0 、 $1 、 ...... 、 $n ,以及 $# 、 $* 、$@这些特殊变量 :

$0 为执行脚本的文件名; $1 是传递给函数的第 1 个参数 ; $# 为传递给函数的参数个数; $* 和 $@ 为传递给函数的所有参数

[function] 函数名(){

命令}

函数名 [ 参数 1 参数 2 ... 参数n ]

Page 27: 第 6 章  shell 程序设计

27

函数对变量的访问示例利用 shift 访问参数变量

function demo_fun() 函数开始{......

while [ -n "$1" ] 访问变量 $1, 即第一个变量do

echo "Parameters(\$$count) is:$1" 输出第一个变量

let count=$count+1 变量计数加 1shift 变量左移, $1 变为原来 $1 的右侧的变量

done 即变为下一个变量}......

Page 28: 第 6 章  shell 程序设计

28

Shell程序的调试 1. 使用 trap 命令 格式: trap 'command' signal

信号名 何时产生EXIT 从一个函数中退出或整个脚本执行完毕 ERR 当一条命令返回非零状态时(代表命令执行不成功 ) DEBUG 脚本中每一条命令执行之前

表 1. shell 伪信号

Page 29: 第 6 章  shell 程序设计

29

Shell程序的调试(续)举例:$ cat -n exp1.sh 1 ERRTRAP() 2 { 3 echo "[LINE:$1] Error: Command or function exited with status $?" 4 } 5 foo() 6 { 7 return 1; 8 } 9 trap 'ERRTRAP $LINENO' ERR 10 abc 11 foo

Page 30: 第 6 章  shell 程序设计

30

Shell程序的调试(续) 其输出结果如下:$ sh exp1.sh exp1.sh: line 10: abc: command not found [LINE:10] Error: Command or function exited with status 127 [LINE:11] Error: Command or function exited with status 1

Page 31: 第 6 章  shell 程序设计

31

Shell程序的调试(续) 以下是一个通过捕获 DEBUG信号来跟踪变量的示例程序 :$ cat –n exp2.sh 1 #!/bin/bash 2 trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG 3 a=1 4 if [ "$a" -eq 1 ]5 then 6 b=2 7 else 8 b=1 9 fi 10 c=3 11 echo "end"

Page 32: 第 6 章  shell 程序设计

32

Shell程序的调试(续) 其输出结果如下: $ sh exp2.sh before execute line:3, a=,b=,c= before execute line:4, a=1,b=,c= before execute line:6, a=1,b=,c= before execute line:10, a=1,b=2,c= before execute line:11, a=1,b=2,c=3 end

Page 33: 第 6 章  shell 程序设计

33

Shell程序的调试(续) 2. 使用 shell 的执行选项 -n 只读取 shell脚本,但不实际执行-x 进入跟踪方式,显示所执行的每一条命令-c "string" 从 strings 中读取命令

Page 34: 第 6 章  shell 程序设计

34

Shell程序的调试(续) 仍以前面所述的 exp2.sh 为例,现在加上“ -x” 选项来执行它: $ sh –x exp2.sh + trap 'echo "before execute line:$LINENO, a=$a,b=$b,c=$c"' DEBUG ++ echo 'before execute line:3, a=,b=,c=' before execute line:3, a=,b=,c= + a=1 ++ echo 'before execute line:4, a=1,b=,c=' before execute line:4, a=1,b=,c= + '[' 1 -eq 1 ']' ++ echo 'before execute line:6, a=1,b=,c=' before execute line:6, a=1,b=,c= + b=2 ++ echo 'before execute line:10, a=1,b=2,c=' before execute line:10, a=1,b=2,c= + c=3 ++ echo 'before execute line:11, a=1,b=2,c=3' before execute line:11, a=1,b=2,c=3 + echo end end

Page 35: 第 6 章  shell 程序设计

35

Shell程序的调试(续) 在上面的结果中,前面有“ +” 号的行是 shell脚本实际执行的命令,前面有“ ++” 号的行是执行 trap 机制中指定的命令,其它的行则是输出信息。

Page 36: 第 6 章  shell 程序设计

36

课后练习 什么是 shell 程序? Redhat linux 9 有哪些种 shell? 什么是 shell 程序? 比较 shell 程序和其它程序的异同。 说明 shell 程序的一般格式。 在 Bash 中如何声明变量? Bash 中变量声明和 c/c++ 程序中变量声明有什么不同? 简述 $n ( n = 0 、 1 、 2...... ), $# , $* , $@ 特殊变量的含义和用法。

Page 37: 第 6 章  shell 程序设计

37

课后练习 Bash 中有哪些常用的运算符? Bash 中有哪些常用的控制结构? 在 Bash 中如何获取并使用传递给函数的参数? 分析文件 /etc/bashrc 的内容,看看它主要完成哪些功能? 编写一个 shell 程序,控制可执行文件 /usr/local/bin/myserver 的启动 /停止 /重新启动。