




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计n重庆邮电大学计算机学院n吴思远 n2016-09-21内容nLinux shell程序设计nLinux设备驱动程序设计Linux shell程序设计 Shell脚本和Shell编程n当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 Shell 脚本。qShell 脚本是纯文本文件。qShell 脚本通常以 .sh 作为后缀名,但不是必须。qShell 脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。nShell 是一种功能强大的解释型解释型编程语言q通常用于完成特定的、较复杂的系统管理任务qShell 脚本语言非常擅长处理文本类型的数据2022年5月
2、4日4Shell脚本的成分n程序元素q保留字、运算符、表达式q变量、数组、输入输出q控制结构(顺序、分支、循环、子程序调用)nShell功能 q执行命令(内置命令、外部命令、自编程序)q重定向、管道、命令替换、重定向、管道、命令替换、q通配符、注释符、qShell环境2022年5月4日5Shell 脚本的建立与执行nShell 脚本的建立q使用文本编辑器编辑脚本文件$ vi script-fileq为脚本文件添加可执行权限$ chmod +x script-filenShell 脚本的执行q在子Shell中执行$ bash script-file$ script-fileq在当前Shell中执
3、行$ source script-file$ . script-file2022年5月4日6PATH 环境变量的默认值不包含当前目录,若脚本文件在当前目录,应使用 ./script-filePATH 环境变量的默认值包含 /bin 目录,用户可以将自己的脚本文件存放在 /bin 目录,之后即可直接调用脚本文件名执行脚本了Shell 脚本的编码规范n以 #! 开头:通知系统用何解释器执行此脚本#!/bin/bash#!/bin/kshn以注释形式说明如下的内容:# 脚本名称# 脚本功能# 作者及联系方式# 版本更新记录# 版权声明# 对算法做简要说明(如果是复杂脚本)2022年5月4日7Shel
4、l脚本举例(1)2022年5月4日8#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shechoecho -e Hello $LOGNAME, cecho its nice talking to you.echo -n Your present working directory is: pwd # Show the name of present directoryechoecho -e The time is date +%T!. nByeechoShell脚本举例(2)2022年5月4日9
5、#!/bin/bash# Script Name:/etc/cron.daily/ntpdate# 使用使用NTP的客户端命令的客户端命令ntpdate与远程与远程NTP服务器进行同步服务器进行同步# 也可以用局域网内的也可以用局域网内的NTP服务器替换服务器替换 /usr/sbin/ntpdate -s # 更改硬件时钟时都会记录在更改硬件时钟时都会记录在/etc/adjtime文件中文件中# 使使hwclock根据先前的记录来估算硬件时钟的偏差,根据先前的记录来估算硬件时钟的偏差,# 并用来校正目前的硬件时钟并用来校正目前的硬件时钟/sbin
6、/hwclock -adjust# 将系统时钟同步到硬件时钟将系统时钟同步到硬件时钟/sbin/hwclock systohc Shell脚本的类型n非交互式脚本q不需要读取用户的输入, 也不用向用户反馈某些信息q每次执行都是可预见的, 因为它不读取用户输入, 参数是固定的q可以在后台执行n交互式脚本q脚本可以读取用户的输入, 实时向用户反馈信息(输出某些信息)q这样的脚本更灵活, 每次执行时的参数可由用户动态设定q用户界面更友好,但不适用于自动化任务(如cron任务)2022年5月4日10学习Shell编程的前提n掌握一种文本编辑器的使用(Vi)n熟悉 Linux 文件系统的布局n学习 Sh
7、ell 的各种功能q重定向、管道、命令替换、命令聚合n学习各种管理和监视命令的使用q用户管理、权限管理、进程管理、包管理q系统监视、网络监视 n学习各种文本文件工具的使用qcat、grep、tr、sed、awk q正则表达式2022年5月4日11系统的配置文件几乎都是纯文本文件变量和表达式变量和表达式2022年5月4日12Shell 变量的分类变量的分类n用户自定义变量用户自定义变量q由用户自己定义、修改和使用nShell Shell 环境变量环境变量q由系统维护,用于设置用户的Shell工作环境q只有少数的变量用户可以修改其值n位置参数变量位置参数变量(Positional Paramete
8、rs)q通过命令行给程序传递执行参数q可用 shift 命令实现位置参数的迁移n专用参数变量专用参数变量(Special Parameters)qBash 预定义的特殊变量q用户不能修改其值2022年5月4日13位置参数变量n是一组特殊的内置变量q跟在脚本名后面的用空格隔开的每个字符串q$1 表示第1个参数值,$9 表示第9个参数值q$10 表示第10个参数值, $11 表示第11个参数值, n位置参数的用途q从 shell 命令/脚本 的命令行接受参数q在调用 shell 函数时为其传递参数2022年5月4日14专用参数变量n命令行参数相关命令行参数相关q$* 将所有位置参量看成一个字符串(
9、以空格间隔) 。q$ 将每个位置参量看成单独的字符串(以空格间隔)。q “$*” 将所有位置参量看成一个字符串(以$IFS间隔)。q “$” 将每个位置参量看成单独的字符串(以空格间隔) 。q$0 命令行上输入的Shell程序名。q$# 表示命令行上参数的个数。n进程状态相关进程状态相关q$? 表示上一条命令执行后的返回值q$ 当前进程的进程号q$! 显示运行在后台的最后一个作业的 PID q$_ 在此之前执行的命令或脚本的最后一个参数2022年5月4日15readn从键盘输入内容为变量赋值qread -p 信息信息 var1 var2 .q若省略变量名,则将输入的内容存入REPLY变量n结合
10、不同的引号为变量赋值q双引号 ” ”:允许通过$符号引用其他变量值q单引号 :禁止引用其他变量值,$视为普通字符q反撇号 :将命令执行的结果输出给变量n更多read的用法参见q/guide/Getting_User_Input_Via_Keyboard2022年5月4日16read 举例2022年5月4日17#!/bin/bash# This script is to test the usage of read# Scriptname: ex4read.shecho = examples for testing read =echo -e Wh
11、at is your name? cread nameecho Hello $nameechoecho -n Where do you work? readecho I guess $REPLY keeps you busy!echoread -p Enter your job title: echo I thought you might be an $REPLY.echoecho = End of the script =只读变量n举例2022年5月4日18q 只读变量readonly variable是指不能被清除或重新赋值的变量。lrjcentos1 $ myname=Osmondlr
12、jcentos1 $ echo $mynameOsmondlrjcentos1 $ readonly mynamelrjcentos1 $ unset myname-bash: unset: myname: cannot unset: readonly variablelrjcentos1 $ myname=Osmond Liang-bash: myname: readonly variablelrjcentos1 $整数运算nBash 变量没有严格的类型定义q本质上 Bash 变量都是字符串n若一个字面常量或变量的值是纯数字的,不包含字母或其他字符, Bash可以将其视为长整型值,并可做算数
13、运算和比较运算。nBash 也允许显式地声明整型变量qdeclare -i 变量名2022年5月4日19算数运算符2022年5月4日20+、 -、 *、 / (四则运算)(四则运算)*、 % (幂运算(幂运算 和和 模运算,取余数)模运算,取余数) (按位左移(按位左移 和和 按位右移)按位右移)&、 、 | (按位(按位与与 、按位、按位异或异或 和和 按位按位 或或)=、 +=、 -= 、 *=、 /= 、 %= = 、 &=、 =、 |= (赋值运算)(赋值运算)、 =、 =、 != (比较操作符)(比较操作符)&、 | (逻辑(逻辑与与 和和 逻辑逻辑 或或)注
14、:按位运算是以二进制形式进行的。条件测试条件测试2022年5月4日21条件测试简介n条件测试可以判断某个特定条件是否满足q测试之后通常会根据不同的测试值选择执行不同任务n条件测试的种类q命令成功或失败q表达式为真或假n条件测试的值qBash中没有布尔类型变量n退出状态为 0 表示命令成功或表达式为真n非非0 则表示命令失败或表达式为假q状态变量 $? 中保存了退出状态的值2022年5月4日22条件测试语句n语句q格式1: test q格式2: q格式3: (bash 2.x 版本以上)n说明q格式1 和 格式2 是等价的,格式3是扩展的 test 命令q在 中可以使用通配符进行模式匹配可以使用
15、通配符进行模式匹配q&, |, 能够正常存在于 中,但不能在 中出现q和之后的字符必须为空格,和之前的字符必须为空格q要对整数进行关系运算也可以使用 () 进行测试2022年5月4日23条件测试操作符n条件测试表达式中可用的操作符q文件测试操作符q字符串测试操作符q整数二元比较操作符q使用逻辑运算符2022年5月4日24文件测试2022年5月4日25 -f fname fname 存在且是普通文件时,返回真 ( 即返回 0 ) -L fname fname 存在且是链接文件时,返回真 -d fname fname 存在且是一个目录时,返回真 -e fname fname(文件或目录)存
16、在时,返回真 -s fname fname 存在且大小大于 0 时,返回真 -r fname fname(文件或目录)存在且可读时,返回真 -w fname fname(文件或目录)存在且可写时,返回真 -x fname fname(文件或目录)存在且可执行时,返回真q测试:文件是否存在,文件属性,访问权限等。l 更多文件测试符参见 test 的在线帮助man test整数测试(1)2022年5月4日 26 int1 -eq int2 int1 等于等于 int2 返回真返回真 int1 -ne int2 int1 不等于不等于 int2 返回真返回真 int1 -gt int2 int1 大
17、于大于 int2 返回真返回真 int1 -ge int2 int1 大于或等于大于或等于 int2 返回真返回真 int1 -lt int2 int1 小于小于 int2 返回真返回真 int1 -eq int2 int1 等于等于 int2 返回真返回真 int1 -ne int2 int1 不等于不等于 int2 返回真返回真 int1 -gt int2 int1 大于大于 int2 返回真返回真 int1 -ge int2 int1 大于或等于大于或等于 int2 返回真返回真 int1 -lt int2 int1 小于小于 int2 返回真返回真 int1 -le int2 int1
18、 小于或等于小于或等于 int2 返回真返回真操作符两边必须留空格!整数测试(2)2022年5月4日27(int1 = int2) int1 等于等于 int2 返回真返回真(int1 != int2) int1 不等于不等于 int2 返回真返回真(int1 int2) int1 大于大于 int2 返回真返回真(int1 = int2) int1 大于或等于大于或等于 int2 返回真返回真(int1 int2) int1 小于小于 int2 返回真返回真(int1 $m ; echo $?1$ (nm) ; echo $?1$ ($n$m) ; echo $?1$ nm ; echo $
19、?0$ a=linux ; b=unix$ n=5 ; m=7$ $a != $b & echo T | echo FT$ $a != $b & echo T| echo FT$ $n -gt $m & echo T | echo FT$ $n$m & echo T | echo FF$ (nm) & echo T | echo FF$ ($n$m) & echo T | echo FF$ nm & echo T | echo FT逻辑测试2022年5月4日29 pattern1 & pattern2 逻辑与 pattern1 |
20、 pattern2 逻辑或 ! pattern 逻辑非 expr1 -a expr2 逻辑与,都为真时,结果为真 expr1 -o expr2 逻辑或,有一个为真时,结果为真 ! expr 逻辑非( expr1 & expr2 )逻辑与( expr1 | expr2 )逻辑或( ! expr )逻辑非流程控制流程控制分支分支2022年5月4日30流程控制语句q分支q if 条件语句q case 选择语句q循环q for 循环语句q while 循环语句q until 循环语句q select 循环与菜单2022年5月4日31q循环控制qbreak 语句qcontinue 语句q位置参数
21、处理q shift 命令q getopts 命令 分支结构if 语句语法2022年5月4日32if expr1 # 如果如果 expr1 为真为真(返回值为返回值为0)then # 那么那么 commands1 # 执行语句块执行语句块 commands1elif expr2 # 若若 expr1 不真,而不真,而 expr2 为真为真then # 那么那么 commands2 # 执行语句块执行语句块 commands2 . . # 可以有多个可以有多个 elif 语句语句 else # else 最多只能有一个最多只能有一个 commands4 # 执行语句块执行语句块 commands4
22、fi # if 语句必须以单词语句必须以单词 fi 终止终止分支结构if 语句说明2022年5月4日33u commands 为可执行语句块,如果为空,需使用为可执行语句块,如果为空,需使用 shell 提供的空命令提供的空命令 “ : ”,即冒号。该命令不做任何事情,只,即冒号。该命令不做任何事情,只返回一个退出状态返回一个退出状态 0u if 语句可以嵌套使用语句可以嵌套使用u elif 可以有任意多个(可以有任意多个(0 个或多个)个或多个)u else 最多只能有一个(最多只能有一个(0 个或个或 1 个)个)u if 语句必须以语句必须以 fi 表示结束表示结束u exprX 通常为
23、条件测试表达式;也可以是多个命令,以通常为条件测试表达式;也可以是多个命令,以最后一个命令的退出状态为条件值。最后一个命令的退出状态为条件值。分支结构if 语句举例12022年5月4日34#!/bin/bash# filename: areyouok.shecho Are you OK ?read answer# # 在在 if if 的条件判断部分使用扩展的的条件判断部分使用扩展的 test test 语句语句 . .# # 在在 中可以使用中可以使用shellshell的通配符进行条件匹配的通配符进行条件匹配if $answer=Yy* | $answer=Mmaybe then echo
24、 Glad to hear it.fi分支结构case 语句语法2022年5月4日35case expr in # expr 为表达式,关键词为表达式,关键词 in 不要忘!不要忘! pattern1) # 若若 expr 与与 pattern1 匹配,注意括号匹配,注意括号 commands1 # 执行语句块执行语句块 commands1 ; # 跳出跳出 case 结构结构 pattern2) # 若若 expr 与与 pattern2 匹配匹配 commands2 # 执行语句块执行语句块 commands2 ; # 跳出跳出 case 结构结构 . . # 可以有任意多个模式匹配可以有
25、任意多个模式匹配 *) # 若若 expr 与上面的模式都不匹配与上面的模式都不匹配 commands # 执行语句块执行语句块 commands ; # 跳出跳出 case 结构结构esac # case 语句必须以语句必须以 esac 终止终止分支结构case 语句说明2022年5月4日36u 每个命令块的最后必须有一个双分号,可以独占一行,或放在最后一个命令的后面。u 所给的匹配模式 pattern 中可以含有通配符和“ | ”。u 如果 expr 没有找到匹配的模式,则执行缺省值 “ *) ” 后面的命令块 ( 类似于 if 中的 else );“ *) ” 可以不出现。u 表达式 e
26、xpr 按顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面的所有命令,然后退出 case。分支结构case 语句举例12022年5月4日37#!/bin/bash# filename: what-lang-do-you-like.shecho What is your preferred scripting language?echo 1) bashecho 2) perlecho 3) pythonecho 4) rubyecho 5) I do not know !read langcase $lang in 1) echo You selected bash ; 2) echo
27、 You selected perl ; 3) echo You selected python; 4) echo You selected ruby ; 5) exit esac流程控制流程控制循环循环2022年5月4日38for循环(for each型)语法n语法n说明q列表 list 可以是命令替换、变量名替换、字符串和文件名列表 ( 可包含通配符 ),每个列表项以空格间隔q for 循环执行的次数取决于列表 list 中单词的个数q 可以可以省略省略 in list ,省略时相当于省略时相当于 in $2022年5月4日39for variable in list # 每一次循环,依次
28、把列表每一次循环,依次把列表 list 中的一个值赋给循环变量中的一个值赋给循环变量do # 循环体开始的标志循环体开始的标志 commands # 循环变量每取一次值,循环体就执行一遍循环变量每取一次值,循环体就执行一遍done # 循环结束的标志循环结束的标志,返回循环顶部,返回循环顶部for循环(foreach型)举例12022年5月4日40#!/bin/bash# filename: for1-constant_as_list.sh# # 使用字面字符串列表作为使用字面字符串列表作为 WordListWordListfor x in centos ubuntu gentoo opens
29、usedo echo $x ; done# # 若列表项中包含空格必需使用引号括起来若列表项中包含空格必需使用引号括起来for x in Linux Gnu Hurd FreeBSD Mac OS Xdo echo $x ; donefor x in ls df -h du -shdo echo =$x= ; eval $xdonefor x in centos ubuntu gentoo opensusefor x in centos ubuntu gentoo opensuse比较比较break 和 continue2022年5月4日41l 用于强行退出当前循环。l 如果是嵌套循环,则 b
30、reak 命令后面可以跟一数字 n,表示退出第 n 重循环(最里面的为第一重循环)。l 用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环。l 如果是嵌套循环,continue 命令后面也可跟一数字 n,表示回到第 n 重循环的顶部。break ncontinue nfor循环(C语言型)语法n语法n说明q通常 expr1和和 expr3是算数表达式; expr2是逻辑表达式q expr1 仅在循环开始之初执行一次q expr2 在每次执行循环体之前执行一次q expr3 在在每次执行循环体之后执行一次2022年5月4日42for (expr1;expr2;expr3) # 执行执行
31、expr1do # 若若 expr2的值为真时的值为真时进入循环,否则退出进入循环,否则退出 for循环循环 commands # 执行循环体,之后执行循环体,之后执行执行 expr3done # 循环结束的标志循环结束的标志,返回循环顶部,返回循环顶部for循环(C语言型)举例12022年5月4日 43#!/bin/bash# filename: for-C-style.shfor (i=0;i10;i+) ; do echo $i; donefor ( i=1; i = 10; i+ ) do echo Random number $i: $RANDOM done for (i=1, j=
32、10; i /dev/nulldo sleep 60donessh $ipadd循环与菜单n一般地,使用 while 循环配合 case实现nBash 提供了专门的 select 循环qselect 循环主要用于创建菜单qselect 是个无限循环n通常要配合 case 语句处理不同的选单及退出nselect 循环的退出q按 ctrl+c 退出循环q在循环体内用 break 命令退出循环q或用 exit 命令终止脚本2022年5月4日 48使用while循环实现菜单2022年5月4日 49#!/bin/bash# filename: what-lang-do-you-like_while.sh
33、while truedo echo = Scripting Language = echo 1) bash echo 2) perl echo 3) python echo 4) ruby echo 5) I do not know ! (Quit) read p What is your preferred scripting language? lang case $lang in 1) echo You selected bash ; 2) echo You selected perl ; 3) echo You selected python; 4) echo You selected
34、 ruby ; 5) exit esacdone函数函数2022年5月4日50 Shell函数简介n为了避免大型脚本变得复杂、晦涩而使用函数n将大型脚本代码分割成小块,将这些被命名的代码块称为函数q一个函数就是一个子程序,用于完成特定的任务n如:添加一个用户、判断用户是否为管理员 等n函数定义之后可以被使用它的主程序调用q调用函数的方法与执行Shell命令无异q可以在Shell脚本中调用(函数需先定义而后调用)q在命令行上直接调用(定义函数的文件需先加载)2022年5月4日 51合理使用Shell函数n简化程序代码,实现代码重用简化程序代码,实现代码重用q实现一次定义多次调用。如:is_roo
35、t_user()函数可以由不同的shell脚本重复使用。n实现结构化编程实现结构化编程q使脚本内容更加简洁,增强程序的易读性n提高执行效率提高执行效率q将常用的功能定义为多个函数并将其保存在一个文件中n类似其他语言的“模块”文件q在 /bashrc 或命令行上使用 source 命令调用这个文件q此文件中定义的多个函数一次性地调入内存,从而加快运行速度2022年5月4日 52函数的定义和调用n函数定义n函数调用只需输入函数名即可调用函数函数必须在调用之前定义2022年5月4日 53function 函数名函数名 commands 函数名函数名 () commands函数名函数名函数名函数名 参
36、数参数1 参数参数2 .函数的存储和显示n函数的存储q函数和调用它的主程序保存在同一个文件中n函数的定义必须出现在调用之前q函数和调用它的主程序保存在不同的文件中n保存函数的文件必须先使用 source 命令执行,之后才能调用其中的函数n函数的显示q显示当前Shell可见的所有函数名$ declare -Fq显示当前Shell可见的所有(指定)的函数定义$ declare -f$ declare -f 2022年5月4日 54函数的定义和调用举例12022年5月4日 55#!/bin/bash# filename: all_in_one_backup_select.sh# User defin
37、e Function (UDF) #sql_bak () echo Running mysqldump tool.; sync_bak () echo Running rsync tool.; git_bak () echo Running gistore tool.; tar_bak () echo Running tar tool.; # Main script starts here #PS3=Please choose a backup tools : select s in mysqldump rsync gistore tar quit ; do case $REPLY in 1)
38、 sql_bak ; 2) sync_bak ; 3) git_bak ; 4) tar_bak ; 5) exit ; esacdone使用标准输出返回函数值2022年5月4日 56#!/bin/bash# filename: function_to-upper.sh# User define Function (UDF)to_upper () local str=$ local output output=$(tr a-z A-Z$str) echo $output# Main script starts here #to_upper This Is a TESTres=$(to_uppe
39、r $)echo $resres=$(to_upper $1) $res = YES & echo Continue. | echo Stop./function_to-upper.sh YES we are./function_to-upper.sh No we are not系统INIT 启动脚本的结构/etc/rc.d/init.d/*2022年5月4日 57# exec source function library. /etc/rc.d/init.d/functionsstart() stop() restart() stop startcase $1 in start) start ; stop) stop ; restart|reload) restart ; esac阅读 /etc/etc/init.dinit.d/ / 目录下的启动脚本,熟悉 ShellShell 编程进一步学习nBash Reference Manualq/software/bash/manual/q/usr/share/doc/bash-*/bashref.htmlnBash script examplesq/us
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年学前教育与发展心理学考试题及答案
- 2025年心理应用与咨询实践考试试卷及答案
- 2025年心理健康教育师考试题及答案
- 2025年现代通信技术基础与应用考试卷及答案
- 2025年人工智能的发展与应用知识试卷及答案
- 2025年酒店管理执业资格考试试题及答案
- 2025年机械设计及制造专业考试试卷及答案
- 2025年国际关系与外交专业考研真题试题及答案
- 2025年广告学专业知识考试试卷及答案
- 2025年高级项目经理职业资格考试试卷及答案
- 23《海底世界》说课稿- 2023-2024学年统编版语文三年级下册
- 2024年黑龙江省《辅警招聘考试必刷500题》考试题库附答案(满分必刷)
- 2025年广西宏桂集团招聘笔试参考题库含答案解析
- 起重机培训课件-指挥职责及操作
- 经济地理学讲义(2024级)
- 电网智能化运维管理平台建设
- 无处不在-传染病知到智慧树章节测试课后答案2024年秋南昌大学
- 公司人事管理制度范文(2篇)
- 国家开放大学电大22270资源与运营管理(统设课)期末终考题库参考答案
- 酒店养生药膳培训课件
- 中职语文高二上学期拓展模块上册期末模拟卷1原卷版
评论
0/150
提交评论