《嵌入式操作系统 Linux篇 教学课件 ppt 作者 华清远见嵌入式学院 程姚根 苗德行 第8章 shell编程》由会员分享,可在线阅读,更多相关《嵌入式操作系统 Linux篇 教学课件 ppt 作者 华清远见嵌入式学院 程姚根 苗德行 第8章 shell编程(52页珍藏版)》请在金锄头文库上搜索。
1、,Shell编程基础,www.embedu.org,本章的要求,第八章、shell编程基础 熟悉shell基础 熟悉shell变量及环境变量 熟悉使用shell测试语句 熟练使用shell控制语句 熟练使用shell函数 熟悉shell数组,www.embedu.org,8.1 Linux下shell编程基础,www.embedu.org,4,Shell脚本的本质,编译型语言 解释型语言 Shell脚本语言是解释型语言 Shell脚本的本质: Shell命令的有序集合。,www.embedu.org,5,shell 编程的基本过程,基本过程分为三步:,Step1. 建立 shell 文件 包含
2、任意多行操作系统命令或shell命令的文本文件;,Step2. 赋予shell文件执行权限 用chmod命令修改权限;,Step3. 执行shell文件 直接在命令行上调用shell程序.,www.embedu.org,6,Step1: 建立shell文件 (可用任何建立文本文件的方法) $ cat prog1.sh date,Step2: 赋予执行权限: (初始文本文件无执行权限) $ chmod 740 prog1.sh,Step3: 执行该shell程序 $ prog1.sh prog1.sh: not found (shell在标准搜索路径中找不到prog1.sh),Step4: 指定
3、路径或修改环境变量PATH后执行shell程序 $ ./prog1.sh 2009年 12月 16日 星期二 14:52:57 CST,实例,www.embedu.org,8.2 Linux下shell变量及环境变量,www.embedu.org,8,Shell变量,Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符 Variable=value 命名规则同C+中的命名规则 count=1 echo $count DATE=date echo $DATE,www.embedu.org,9,shell变量,Bourne Shell有如下
4、四种变量: 用户自定义变量 位置变量即 命令行参数 预定义变量 环境变量,www.embedu.org,10,用户自定义变量,在shell编程中通常使用全大写变量,方便识别 $ COUNT=1 变量的调用:在变量前加$ $ echo $HOME Linux Shell/bash从右向左赋值 $Y=y $ X=$Y $ echo $X y 使用unset命令删除变量的赋值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z,www.embedu.org,11,位置变量,$0 与键入的命令行一样,包含脚本文件名 $1,$2,$9 分别包含第一个到第九个命令行
5、参数 $# 包含命令行参数的个数 $ 包含所有命令行参数:“$1,$2,$9” $? 包含前一个命令的退出状态 $* 包含所有命令行参数:“$1,$2,$9” $ 包含正在执行进程的ID号,www.embedu.org,12,常用shell环境变量,HOME: /etc/passwd文件中列出的用户主目录 IFS:Internal Field Separator, 默认为空格,tab及换行符 PATH :shell搜索路径 PS1,PS2:默认提示符($)及换行提示符() TERM:终端类型,常用的有vt100,ansi,vt200,xterm等,www.embedu.org,8.3 Linu
6、x下shell测试语句,www.embedu.org,14,shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。 说明性语句: 以#号开始到该行结束,不被解释执行 功能性语句: 任意的shell命令、用户程序或其它shell程序。 结构性语句: 条件测试语句、多路分支语句、循环语句、循环控制语句等。,shell 程序和语句,www.embedu.org,15,注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如: #! /bin/sh # # 本程序说明
7、# command_1 command_2 # command_2的语句说明 # 下面程序段的说明 command_m command_n # commandn_语句的说明 ,告诉OS用哪种类型的shell来解释执行该程序,说明性语句(注释行),www.embedu.org,16,read read从标准输入读入一行, 并赋值给后面的变量,其语法为: . read var 把读入的数据全部赋给var . read var1 var2 var3 把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, 把其余所有的词赋给最后一个变量. 如果执行read语句时标准输入无数据, 则
8、程序在此停留等侯, 直到数据的到来或被终止运行。,常用功能性语句(命令),www.embedu.org,17,# example1 for read echo “Input your name: c“ read username echo “Your name is $username“ #example2 for read echo “Input date with format yyyy mm dd: c“ read year month day echo “Today is $year/$month/$day, right?“ echo “Press enter to confirm a
9、nd continuec“ read answer echo “I know the date, bye!“,应用实例,www.embedu.org,18,expr 算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操作。例如: $ expr 12 + 5 * 3 27 $ expr 3 - 8 / 2 -1 $ num=9 $ sum=expr $num * 6 $ echo $sum 54,反斜线去掉*号的元字符含义,反撇号引用命令的运行结果,www.embedu.org,19,test test语句可测试三种对象: 字符串 整数 文
10、件属性 每种测试对象都有若干测试操作符 例如: test “$answer“ = “yes“ 变量answer的值是否为字符串yes test $num eq 18 变量num的值是否为整数18 test -d tmp 测试tmp是否为一个目录名,www.embedu.org,20,字符串测试,s1 = s2 测试两个字符串的内容是否完全一样 s1 != s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是否为0 -n s1 测试s1 字符串的长度是否不为0,www.embedu.org,21,整数测试,a -eq b 测试a 与b 是否相等 a -ne b 测试a 与b
11、 是否不相等 a -gt b 测试a 是否大于b a -ge b 测试a 是否大于等于b a -lt b 测试a 是否小于b a -le b 测试a 是否小于等于b,www.embedu.org,22,文件测试,-d name 测试name 是否为一个目录 -f name 测试name 是否为普通文件 -L name 测试name 是否为符号链接 -r name 测试name 文件是否存在且为可读 -w name 测试name 文件是否存在且为可写 -x name 测试name 文件是否存在且为可执行 -s name 测试name 文件是否存在且其长度不为0 f1 -nt f2 测试文件f1
12、是否比文件f2 更新 f1 -ot f2 测试文件f1 是否比文件f2 更旧,www.embedu.org,8.4 Linux下shell控制语句,www.embedu.org,24,结构性语句主要根据程序的运行状态、输入数据、变 量的取值、控制信号以及运行时间等因素来控制程序的运 行流程。 主要包括:条件测试语句(两路分支)、多路分支语 句、循环语句、循环控制语句和后台执行语句等。,结构性语句,www.embedu.org,25,ifthenfi 语法结构: if 表达式 then 命令表 fi 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi
13、是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条。,条件语句,www.embedu.org,26,shell程序prog2.sh(测试命令行参数是否为已存在的文件或目录)。用法为: ./prog2.sh file 代码如下: #The statement of ifthenfi (注释语句) if -f $1 (测试参数是否为文件) then echo “File $1 exists“ (引用变量值) fi if -d $HOME/$1 (测试参数是否为目录) then echo “File $1 is a directory“ (引用变量值) fi,实例,w
14、ww.embedu.org,27,执行prog2程序: $ ./prog2.sh prog1.sh File prog1.sh exists $0为prog2.sh; $1为prog1.sh, 是一个已存在的文件. $ ./prog2.sh backup File backup is a directory $0为prog2.sh; $1为backup,是一个已存在的目录.,如果不带参数, 或大于一个参数运行prog2, 例如: $ ./prog2.sh (或 $ ./prog2.sh file1 file2) 会出现什么结果?,www.embedu.org,28,ifthenelsefi 语
15、法结构为: if 表达式 then 命令表1 else 命令表2 fi 如果表达式为真, 则执行命令表1中的命令, 再退出if 语句; 否则执行命令表2中的语句, 再退出if语句.,注意: 无论表达式是否为真, 都有语句要执行.,条件语句,www.embedu.org,29,test命令的使用 test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).,用方括号替代test语句,至少一个空格,至少一个空格,www.embedu.org,30,例子: shell程序prog3.sh, 用法为: ./prog3.sh file 内容如下: #The statement of i
16、fthenelsefi if -d $1 then echo “$1 is a directory“ exit (退出当前的shell程序) else if -f $1 then echo “$1 is a common file“ else echo “unknown“ fi fi,www.embedu.org,31,运行prog3.sh程序: $ ./prog3.sh backup backup is a directory $ ./prog3.sh prog1 prog1 is a common file $ ./prog3.sh abc unknown,prog3.sh是对prog2.sh的优化, 逻辑结构更加清晰合理!,www.embedu.or