470 likes | 666 Views
引入. 高级、专业用户. 编写 Shell 脚本程序. 使用 Shell 命令. Linux 操作系统应用. 实训 23 Shell 编程 ( 选学内容 ). 任务 1 Shell 程序的编写与执行. 统计车间生产数据. 每天上午和下午下班前必须对数据进行双硬盘备份,且要求保存最近 3 次备份。. 改手工为 Shell 程序进行备份。. 备份的数据存放于 /home/hbzy/workdata/. 最近三次备份文件为 worknewdata.tar 、 work2nddata.tar 、 work3rddata.tar.
E N D
引入 高级、专业用户 编写Shell脚本程序 使用Shell命令
Linux操作系统应用 实训23 Shell编程(选学内容) 任务1 Shell程序的编写与执行
统计车间生产数据 每天上午和下午下班前必须对数据进行双硬盘备份,且要求保存最近3次备份。 改手工为Shell程序进行备份。 备份的数据存放于/home/hbzy/workdata/ 最近三次备份文件为worknewdata.tar、work2nddata.tar、work3rddata.tar 备份文件存放于/home/hbzy/disk1backup/和/dev/disk2backup/ • 任务描述
任务实施流程 浏览“相关资讯” 任务准备 设计执行任务的程序结构与流程 用vi编辑Shell程序 调试shell程序 执行shell程序
1 什么是Shell程序 2 为什么要使用Shell编程 • 相关资讯 Shell本身就是一个解释型的程序设计语言,输入的任何命令都能直接添加到一个可执行的Shell程序中;它还提供了定义变量和参数的手段、丰富的程序控制结构。 把多个命令编制成一个Shell程序(Shell脚本)来完成这些复杂任务。
3 Shell程序基本组成 ·主体:是变量、控制语句及命令语句组成。 ·以#!作为第一行开头,用#表示注释。 4 在Shell脚本中常用的bash内部命令 (1)echo 功能:在屏幕上显示出由arg参数指定的字符串。 格式:echo arg • 相关资讯
4 在Shell脚本中常用的bash内部命令 • 相关资讯 (2)eval 功能:读入参数args,并将它们合并成一个新的命令,然后执行。 格式:eval args (3)exec 功能:不创建新的子进程,而是转去执行指定的命令,当指定的命令执行完成时,该进程就终止。 格式:exec 命令参数 (4)wait 功能:使Shell等待在后台启动的所有子进程结束,wait的返回值总为真。 格式:wait (5)exit 功能:退出Shell程序。 格式:exit [数字] (6)“.”(点) 功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。 格式: .Shell程序文件名
1 2 一台装有RHEL 5 Server操作系统的计算机,系统装载2块硬盘,其中非引导硬盘挂载为/dev/disk2backup;在主硬盘/home/hbzy/下建立有workdata、disk1backup两个目录分别用来存放用户工作数据文件和用户工作数据备份文件(worknewdata.tar、work2nddata.tar、work3rddata.tar)。 启动该计算机以hbzy帐号(密码hbzy123)进入字符界面。 • 任务准备
3 图10-1 查看/home/hbzy/disk1backup目录 图10-2 查看/dev/disk2backup目录 • 任务准备 查看执行任务前相关目录的状态。 -用cd命令进入/home/hbzy/disk1backup/目录,再用ls –l 命令显示,如图10-1所示。 -用cd命令进入/dev/disk2backup/目录,然后用ls –l 命令显示,如图10-2所示。
步骤1 设计完成任务的程序结构、流程 • 任务实施 在动手编写程序前,必须先构思并设计出完成任务的程序基本结构、流程如下: (1) 使用rm命令删除/home/hbzy/disk1backup/目录下的work3rddata.tar文件。 (2) 使用mv命令将/home/hbzy/disk1backup/目录下的work2nddata.tar改名为work3rddata.tar。 (3) 使用mv命令将/home/hbzy/disk1backup/目录下的worknewdata.tar改名为work2nddata.tar。 (4) 使用tar命令将/home/hbzy/workdata/目录备份为worknewdata.tar文件存放于/home/hbzy/disk1backup/目录中。 (5) 使用rm命令删除/dev/disk2data/目录中的worknewdata.tar、work2nddata.tar、work3rddata.tar三个文件。 (6) 使用cp命令将/home/hbzy/disk1backup/目录下worknewdata.tar、work2nddata.tar、work3rddata.tar三个文件复制到/dev/disk2backup/目录中。 (7) 使用输出任务完成的提示信息。
步骤2 使用vi编辑Shell程序autobackupdata.shell • 任务实施 (1)启动vi编辑器 输入命令:vi autobackupdata.shell (2)输入程序 在vi编辑器界面输入下列程序内容,输入完毕后保存退出vi。程序内容见下页。
#!/bin/bash #delete file work3rddata.tar rm /home/hbzy/disk1backup/work3rddata.tar #rename file work2nddata.tar to work3rddata.tar mv /home/hbzy/disk1backup/work2nddata.tar /home/hbzy/disk1backup/work3rddata.tar #rename file worknewdata.tar to work2nddata.tar mv /home/hbzy/disk1backup/worknewdata.tar /home/hbzy/diskbackup/work2nddata.tar #backup /home/hbzy/workdata to /home/hbzy/disk1backup/worknewdata.tar tar cf /home/hbzy/disk1backup/worknewdata.tar /home/hbzy/workdata #delete files worknewdata.tar、work2nddata.tar、work3rddata.tar in /dev/disk2data folder rm /dev/disk2backup/worknewdata.tar rm / dev/disk2backup/work2nddata.tar rm / dev/disk2backup/work3rddata.tar #copy worknewdata.tar、work2nddata.tar、work3rddata.tar to /dev/disk2backup cp /home/hbzy/disk1backup/worknewdata.tar /dev/disk2backup/ cp /home/hbzy/disk1backup/work2nddata.tar /dev/disk2backup/ cp /home/hbzy/disk1backup/work3rddata.tar /dev/disk2backup/ echo “Task is finished” • 任务实施
输入命令:bash autobackupdata.shell 如果程序有错,返回“步骤2”修改程序,直到程序正确。 输入命令如图10-4所示: 图10-4 运行Shell程序 • 任务实施 步骤3 调试Shell程序 步骤4 增加Shell程序的可执行权并运行
1 查看任务完成后相关文件状况 查看任务完成后/home/hbzy/disk1backup/、/dev/disk2backup/目录下文件状况。 2 分析观测结果 通过任务完成前后显示的文件创建时间对比可知任务按要求完成。 • 任务检测
每种Shell都有自己的配置文件,用户可设置各种环境变量。重要的Shell环境配置文件有:每种Shell都有自己的配置文件,用户可设置各种环境变量。重要的Shell环境配置文件有: /etc/bashrc 包含系统定义的命令别名和bash的环境变量定义。 /etc/profile 包含系统的环境定义,并指定启动时必须运行的程序。 /etc/inputrc 包含系统的键盘设定,以及针对不同终端程序的键位配置信息。 $HOME/.bashrc 包含为用户定义的命令别名和bash的环境变量定义。 $HOME/bash_profile 包含为用户定义的环境变量,并指定用户登录时需要启动的程序。 $HOME/.inputrc 包含用户的键盘设定,以及针对用户终端的键位配置信息。 Shell环境配置文件 1 • 知识或技能拓展
(1) Shell预定义变量(内建变量) Shell变量类型 2 • 知识或技能拓展 常用的Shell预定义变量有: $#:位置参数的数量。 $*:所有位置参数的内容。 $?:命令执行后返回的状态,用于检查上一个命令执行是否正确(返回0表示该命令被正确执行;返回非0值表示该命令执行出错) $$:当前进程的进程号。 $!:后台运行的最后一个进程号。 $0:当前执行的进程名 $1、$2、$3等:位置参数
(2) Shell环 境变量 Shell变量类型 2 • 知识或技能拓展 常用的Shell环境变量(与系统工作环境有关的变量)有: PATH 命令搜索路径。 PWD 当前工作目录的绝对路径,其取值随cd命令的使用而变化。 SHELL 用户的Shell类型。 PS1 主命令提示符。 IFS Shell使用的分隔符。 LOGNAME 用户登陆名,也就是账户名。 UID 当前用户的识别码。 HOME 用户主目录的位置,通常是/home/用户名。 TERM 终端类型。 HISTFILE 命令历史文件。 HISTSIZE 命令历史文件中最多可包含的命令条数。
(3) 用户变量 Shell变量类型 2 • 知识或技能拓展 用户定义的变量由字母、数字及下划线组成,变量名的第一个字符不能为数字,区分大小写。自定义变量的语法规则: -变量名=变量值 这样创建的变量是只属于当前Shell程序的局部变量。 -export 变量名 将一个局部变量提供给其它命令或Shell程序使用。 -export 变量名=变量值 在给变量赋值的同时使用export命令。 -readonly 变量名 保证变量的只读性。
(4) 参数变量 Shell变量类型 2 • 知识或技能拓展 -变量=${参数-word}:用参数的值来置换变量的值,否则用word置换。 -变量=${参数=word}:用参数的值来置换变量的值,否则把变量设置成word,然后再用word替换参数的值。注意,位置参数不能用于这种方式。 -变量=${参数?word}:用参数的值来置换变量的值,否则就显示word,并从Shell程序退出。 -变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。
Shell程序的优点和基本组成 Shell程序中常用的内部命令 编写Shell程序的基本过程和基本方法 (重点) Shell环境配置文件 (重点) Shell变量类型(重点、难点) • 任务总结
一 1、2、3、4、5、6、7、8、9、10 二 1、2、3 • 操作与练习
Thank You ! 行重于思 做重于说
Linux操作系统应用 实训23 Shell编程(选学内容) 任务2 Shell编程应用
创建千人用户帐号 公司用Linux构建网络平台为内部用户提供DNS、POP3、SMTP、FTP等服务。 用户帐号名采用“部门名称+部门名称编号+用户ID号”的形式。 用Shell脚本程序为公司1千多人创建帐号 。 • 任务描述
任务实施流程 浏览“相关资讯” 任务准备 设计执行任务的程序结构与流程 用vi编辑Shell程序 调试shell程序 执行shell程序
1 Shell程序中的变量 (2)位置参数 位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量。 • 相关资讯 (1)定义变量 即给一个变量赋值。用赋值符号(=)来实现。
2 Shell程序中的test命令 (2)整数操作符(用于数值比较表达式) • 相关资讯 (1)字符串操作符(用于计算字符串表达式) tr1 = str2 当str1与str2相同时,返回True。 str1! = str2 当str1与str2不同时,返回True。 str 当str不是空字符时,返回True。 -n str 当str的长度大于0时,返回True。 -z str 当str的长度是0时,返回True。 int1 -eq int2 当int1等于int2时,返回True。 int1 -ge int2 当int1大于或等于int2时,返回True。 int1 -le int2 当int1小于或等于int2时,返回True。 int1 -gt int2 当int1大于int2时,返回True。 int1 -it int2 当int1小于int2时,返回True。 int1 -ne int2 当int1不等于int2时,返回True
2 Shell程序中的test命令 (4)用于文件操作的操作符(检查:文件是否存在,文件类型等) • 相关资讯 (3)逻辑操作符(用于数值比较表达式) -a 与 -o 或 ! 非 -e file 当file存在时,为True。 -s file 当file存在且至少有一个字符时(文件长度大于0),为True。 -d file 当file存在且为目录时,为True。 -f file 当file存在且为普通文件时,为True。 -c file 当file存在且为字符型特殊文件时,为True。 -b file 当file存在且为块特殊文件时,为True。 -r file 当file存在且为可读文件时,为True。 -w file 当file存在且是一个可写文件时,为True。 -x file 当file存在且是一个可执行文件时,为True。
3 Shell程序控制语句 (2)case语句 • 相关资讯 (1)if语句 if expression1 then 若干命令行1 else 若干命令行2 fi case string in exp1) 若干命令行1;; exp2) 若干命令行2;; *) 其它命令行;; esac
3 Shell程序控制语句 (4)while语句 (5)until语句 • 相关资讯 (3)for语句 for 变量名 [in 数值列表] do 若干命令行 done while expression do 若干命令行 done until expression do 若干命令行 done
2 3 1 系统已创建users组。(请读者参照学习情境四中的方法自行创建有关用户) 一台装有RHEL 5 Server操作系统的计算机。 启动该计算机以root帐号(密码root123)进入字符界面。 • 任务准备
4 图10-7显示/home目录结构 图10-8 显示用户情况 • 任务准备 查看任务执行前passwd文件及/home目录的情况 - 用cd命令进入/home目录,然后用tree命令该目录结构,如图10-7所示。 - 用cat /etc/passwd命令查看用户情况,结果部分如图10-8所示。
步骤1 设计执行任务的程序结构、流程 步骤2 使用vi编辑Shell程序creatusers.shell • 任务实施 在动手编写程序前,必须先构思并设计出完成任务的程序基本结构、流程如下: (1) 使用位置参数获取需要建立的部门名称、部门编号、需要建立的用户个数。 (2) 对部门编号处理,使部门编号都为两位数据。 (3) 检查部门公共目录是否存在,如果不存在则建立部门公共目录。 (4) 使用循环语句建立用户帐户。 (5) 为建立的用户设立密码。 (1)启动vi编辑器 输入命令:vi creatusers.shell
步骤2 使用vi编辑Shell程序creatusers.shell • 任务实施 (2)输入程序 输入下列程序内容,输入完毕后保存退出vi。 #!/bin/bash #使用位置参数获取需要建立的部门名称、部门编号、需要建立的用户个数 dept=$1 deptcode=`expr $2 + 0` maxid=`expr $3 + 0`’ #对部门编号处理,使部门编号都为两位数据 if (test $deptcode -le 9) then deptcode="0"$num_class fi #建立部门公共目录。 if [ ! -x /home/allusers ] then mkdir /home/allusers fi
步骤2 使用vi编辑Shell程序creatusers.shell • 任务实施 if [ ! -x /home/allusers/$1$deptcode ] then mkdir /home/allusers/$1$deptcode fi #循环建立用户帐户 #定义用户ID userid =1 #从用户ID号1开始循环,直到最大ID号 while (test $userid -le $maxtid) do #保证用户ID为两位 if (test $userid -le 9) then userid="0"$userid fi #把部门名称、部门编号、用户ID三部分代码组合成用户名,并赋予变量user_name user_name=$dept$deptcode$userid
步骤2 使用vi编辑Shell程序creatusers.shell • 任务实施 #按“name:passwd”的格式逐行追加写入“user_pwlist”文件,以备初始化用户密码 echo $user_name":"$user_name >> user_pwlist #建立用户,同时赋予“users”组,创建该用户目录 adduser -g users -d /home/allusers/$1$deptcode/$user_name $user_name #设置该用户目录的权限为755 chmod 755 /home/alluers/$1$deptcode/$user_name #用户ID号加1,准备下一次循环,建立下一个用户 userid=`expr $userid + 1` done #为建立的用户设立密码,并删除“user_pwlist”文件 chpasswd < user_pwlist pwconv #删除“user_pwlist”文件 rm user_pwlist -f
步骤3 调试Shell程序 输入如图10-10所示命令。 步骤4 增加Shell程序的可执行权并执行 图10-10 运行Shell程序 • 任务实施 输入命令:bash createusers.shell office 1 2 如果程序有错,返回“步骤2”修改程序,直到程序正确。
1 查看任务执行后passwd文件和/home目录的状态 -更改路径:cd /home/allusers -显示目录结构: tree -查看用户情况:cat /etc/passwd 对比任务完成前后/home文件目录状态及用户情况,可知运行Shell程序后建立了相应的用户帐户,并在/home/allusers目录下分别建立了“用户部门名称+部门编号+用户编号”子目录。 2 分析观测结果 • 任务检测
(1) 定义函数 (2) 函数调用 Shell函数 1 (3) 参数传递 • 知识或技能拓展 function 函数名 () { 若干命令行 } 在Shell程序中直接使用函数名称可调用函数。 向函数传递参数就像在脚本中使用位置变量$1,$2,$3……$9。
(1) 信号基本操作 (2) 常见信号的含义 信号(或中断)处理 2 • 知识或技能拓展 ·kill -l 列出所有的信号,以便对其中的信号进行相关操作 ·kill -s SIGKILL 1234 表示无条件终止进程1234(进程号) ·kill 1234 终止进程1234 信号 信号名 含 义 0 SIGEXIT 退出Shell信号,可从命令行输入exit或 在一个进程、命令行中用【Ctrl+d】键 1 SIGHUP 挂起或父进程被杀死 2 SIGINT 来自键盘的中断信号,通常是<CTRL- C> 3 SIGOUIT 从键盘退出 9 SIGKILL 无条件终止 11 SIGSEGV 段(内存)冲突 15 SIGTERM 软件终止(缺省杀进程)
(3) trap捕捉信号 信号(或中断)处理 2 • 知识或技能拓展 用于在Shell程序中捕捉信号,之后可能会采取3种响应方式: ·采取相应的行动 如:trap ‘commands’ signal-list 或trap “commands” signal-list ·接受信号的默认操作 如:trap signal-list ·忽略该信号 如:trap “” signal-list
(1) 在Shell脚本中输出调试信息 Shell程序的调试 3 • 知识或技能拓展 -使用echo或print语句输出信息 显示需要跟踪的量的值。 -使用trap命令跟踪变量的值 在Shell脚本中止执行或从函数中退出时,输出要跟踪的变量值。使用方法是: trap 'command' EXIT或 trap 'command' 0 -使用tee命令 从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件。 -使用DEBUG 在脚本的开发调试阶段,可以先执行export DEBUG=true命令打开调试钩子,使其输出调试信息。
(2) 使用Shell的执行选项 Shell程序的调试 3 • 知识或技能拓展 利用bash命令进行调试。格式:bash-选择项 Shell程序文件名 常用选项有: -n 只读取Shell脚本,但不实际执行。可用来测试Shell程序是否存在语法错误。 -x 进入跟踪方式,把执行的每条命令的命令名、变量名及其取值都显示出来。 -v 进入跟踪方式,把读入的每条命令显示出来。 -u 在变量赋值时,对于没有初始化的变量引用视为出错。 -e 如果程序中的一条命令运行失败就立即退出。
test命令和Shell操作符 (重点) Shell程序控制结构 编写复杂Shell程序的方法 (重点) Shell函数 信号处理 Shell程序的调试方法 (难点) • 任务总结
4 、5 二 • 操作与练习
Thank You ! 行重于思 做重于说
Shell有变量、关键字,各种控制语句,支持函数模块,有自己的语法结构。 Shell程序设计语言可以编写出功能很强、但代码简单的程序。 总结