• 1. College of Information Science and Engineering Shandong Agricultural University SHELL脚本编程
  • 2. shell脚本能提高用户操作和管理员进行系统管理的效率,一般步骤 编辑器编写脚本程序 shell做解释程序,非交互地执行脚本,两种执行方式: 用sh命令执行脚本文件 给脚本文件添加执行权限,用./命令执行2
  • 3. HELLO WORLD!vi hello.s 按i进入插入模式 输入echo “hello world!” :输入wq保存退出 sh hello.s 或者 chmod 755 hello.s ./hello.s3
  • 4. 一、VI编辑器VI的三种工作模式 VI的启动 VI的退出 VI的文本编辑 VI命令模式下的操作 VI行命令模式下的操作VI 编辑器的使用4
  • 5. 系统配置文件、shell脚本文件等都是文本文件,编辑它们都要使用文本编辑器。 在Linux系统中有多种文本编辑器,其中既有字符界面如的VI、EMACAS等,也有图形界面的如“附件”菜单下的“文本编辑器(gedit)”等,用户可以根据自己的喜好选择使用。 学习vi的方法: vi的命令太多且难以记忆,而实际上真正经常使用的命令并不是太多,只要掌握几个关键的并加以适当练习很快就上手使用vi。5
  • 6. 为什么选择VI就使用的方便性而言,有比vi更好的编辑器,还要图形化的edit,为什么还要用vi? 历史久远,功能强大,在有些情况下系统中能够找到的编辑器只有vi; 用户一旦熟悉后,使用非常方便;系统管理员使用正则表达式可以极大地提高工作效率,而学习vi也是掌握正则表达式的有效途径。 由于vi的版本不同,其命令格式、功能和用法会有一些差别。Shell中执行vi命令,RedHat系统实际上是执行vim,它是传统vi的增强版本6
  • 7. 1、VI的三种工作模式命令模式 启动VI默认进入命令模式。此时界面不能编辑,只能接受命令(键入的命令看不到) 文件的保存,退出,文本的删除、复制、搜索等操作 输入模式 编辑模式 命令模式下用i(sert),a(ppend),o,s等均可进入该模式。按esc返回命令模式 行编辑模式 实际上也是命令模式的一种,在命令模式下输入冒号进入一个命令行,可显示地输入命令(所以也有些书认为是两种工作模式)。 三种模式可自由切换,一般切换命令就是操作的英文单词的首字母7
  • 8. 2、VI的启动启动命令:vi my.txt 如果文件存在,则vi显示文件内容并等待用户的命令。 如果指定的文件不存在,则vi将告知用户这是未命名的文件,并进入一个空白的界面。 启动vi时都是默认处于命令模式。用户必须使用命令切换到文本输入模式才能进行输入编辑,或者可执行删除、复制等编辑命令。vi –R file_name,以只读方式打开文件8
  • 9. 3、VI的退出冒号进命令行模式下: :q! 不存档强制退出。 :w 保存但不退出,w(rite)后可加所要存档的文档名。 :wq 存档后退出。 命令模式下按zz,功能与 :wq 相同。 :x 与:wq相同 命令模式: ZZ、ZQ 保存/不保存退出9
  • 10. 4、怎么编辑 必须从命令模式转入插入模式才能进行输入编辑,可用命令有: 新增 (append) a :从光标所在位置后面开始新增资料 A: 从光标所在行最后面的地方开始新增资料。 插入 (insert) i: 从光标所在位置前面开始插入资料 I :从光标所在行的第一个非空白字元前面开始插入资料。 开始 (open) o :在光标所在行下新增一列并进入输入模式。 O: 在光标所在行上方新增一列并进入输入模式。冒号进入行命令模式,输入set nu可设置vi显示行号10
  • 11. 5、命令模式下的操作:删除x: 删除光标所在字符 dw 删除一个单词 dd :删除光标所在的行 u:恢复被删除的文字 s:删除光标所在字节,并进入输入模式 #表示数字 #x 删除几个字符,如3x #dw 删除几个单词,如3dw表示删除三个单词 #dd 删除多个行,如3dd 表示删除光标行及光标的下两行 d$ 删除光标到行尾的内容d光标键: 左:删除光标前面的字符; 右:删除光标所在的字符; 上:将当前行与上一行删除; 下:当前行与下一行删除nd上下光标键: 删除当前行之上、下的几行文本(包括当前行)11
  • 12. 命令模式下的操作:文本复制、粘贴复制命令:y yy: 复制整行 yw:复制光标所在的单词 nyw:复制包括光标所在的n个单词 nyy:复制包括当前行在内的n行 粘贴命令 P 光标移动 h、j、k、l nG:移动到底n行行首12
  • 13. 通用缓冲区和专用缓冲区一般情况下,最近一次的抽取、删除、插入和修改的内容都将存放在通用缓冲区中。利用这些缓冲区可以非常方便地实现文本内容的剪切和粘贴。 专用缓冲区的名字采用双引号加单个字母表示,如”a,”b等等 命令模式下输入”ayy,是将当前行的内容复制到专用缓冲区a中。输入”ap,则将专用缓冲区中的内容粘贴到光标位置之后。 对单个文件的编辑,专用缓冲区没有什么优势,对多个文件编辑才能体现专用缓冲区的优势:从当前文件切换到下一个文件时通用缓冲区的内容会丢失,而专用缓冲区的内容却依然存在。13
  • 14. 示例: 将当前行开始的4行内容向后移动8行。 4dd是删除4行,vi自动将这4行的内容保存在通用缓冲区中; 8j表示将光标向后移动8行; p表示从通用缓冲区中取出内容,粘贴在光标位置后面。由于dd命令使通用缓冲区的内容以行为单位存放,当取出缓冲区的内容时,vi将它们粘贴在当前行之后。 示例: 将某文本文件中的两行复制到新位置。 2yy,表示从当前行开始抽取两行到通用缓冲区。 再将光标移动到目标行的位置后,输入p复制。14
  • 15. 6、行命令模式下的操作:字符串的查找、替换:/string 搜索指定的字符串。 按键n:继续进行搜索 如果写的是斜杠(/):按n会从当前位置向后查找;如果写的是问号(?),按n键则从当前位置向前查找 查找且替换 :%s /SEARCH /REPLACE 把文档中所有SEARCH替换成REPLACE; :#,# s /SEARCH /REPLACE /g #号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE; :s /SEARCH /REPLACE /g 把当前光标所在行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示15
  • 16. * 与当前文件有关的读写操作 :r file_name 导入文件内容添加到光标所在行后 :n1,n5 w file_name 从第n1行到n5行的内容保存到文件file_name中 如果是从当前行到倒数第三行,也可以表示为 .,$-2;如果指定的文件已存在,则vi将给出“File exists”的错误信息,可用下面的命令: :n1,n5 w >>file_name 将指定的文件内容附加重定向地添加到一个已经存在文件的尾部。16
  • 17. * VI操作中执行其他shell命令 用户在编辑文本文件过程中,可以在不退出vi的情况下执行shell命令,行命令模式输入 :!命令 例如: :!ls –l :!mount /dev/sda1 /mnt 命令执行完成后,系统会提醒用户按任意键返回vi编辑器中继续文本文件的编辑工作。 17
  • 18. 文本输入状态命令状态行编辑状态按ESC键按A,I,S,C,O等命令按“:”键执行非退出命令,如w三种模式间的转换关系18
  • 19. 二、SHELL变量与语法基础知识 shell变量 shell控制流程语法 shell中的输出重定向 脚本实例 SHELL变量与语法19
  • 20. 1、基础知识 关于shell脚本文件 一般以.sh为文件后缀。没有也能执行。 常见的两种执行方式 ./文件名 在当前目录下写明路径执行,要求文件必须有执行权限,如 chmod 755 run.sh ./run.sh sh 文件名 sh run.sh 文件开头指定一个或多个解释脚本程序的shell,如 #!/bin/bash 如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。 不指定的话一般默认以/bin/sh执行shell脚本20
  • 21. shell里的特殊字符注释符# 除了#!/bin/bash里的#特殊 美元符 变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来 单引号 被引起的字符全部做普通字符,即全部原样 echo ‘my $SHELL’ 21
  • 22. 双引号 引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。 倒引号 引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。`pwd` 即pwd命令的执行结果 $LOGNAME 系统变量22
  • 23. 练习一下:区别下面几句echo ‘my home is $HOME’ echo “my home is $HOME” echo `my home is $HOME` echo “my home is `pwd`” echo ‘my home is `pwd`’ ` 用于括起来shell命令 ‘ 用于原样显示23
  • 24. 2、shell变量 1)环境变量 程序运行时的一些设置,常用的如PATH,HOME,SHELL,LOGNAME等 PATH的例子: windows下,开始——运行——输入notepad能启动记事本 配置java环境变量可使任何目录都能执行javac命令 linux下的环境变量 一)命令行修改或设置环境变量 只在本次登录的shell内有效。设置好的环境变量可以在当前用户运行的所有程序中使用。 1.显示变量的值   echo $HOME   /home/wxl   2.新增,修改或删除环境变量 export PATH=$PATH:/**/bin24
  • 25. 3. env命令显示所有的环境变量   $ env   HOSTNAME=terry.mykms.org   PVM_RSH=/usr/bin/rsh   SHELL=/bin/bash   TERM=xterm   HISTSIZE=1000   ...   4. set命令显示所有本地定义的Shell变量 5. 设置变量为只读、清除变量内容 $ export TEST="Test..." #增加一个环境变量TEST   $ readonly TEST #将环境变量TEST设为只读   $ unset TEST #会发现此变量不能被删除25
  • 26. 二)让环境变量的修改在退出shell再次登录时仍有效,需要在相关配置文件中修改 1.用户登录Linux涉及环境变量的配置文件有? 有:/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc 2.文件访问顺序如何? 在上述文件中都加入一句:echo “文件名”,如 echo "echo "oh! enter /etc/profile"" >> /etc/profile exit退出登录,重新用root登录看看输出的语句,得到配置文件的使用顺序: /etc/profile  ~/.bash_profile  ~/.bashrc  /etc/bashrc26
  • 27. 3.上述配置文件的作用 1)登录Linux先启动系统配置文件/etc/profile,并从/etc/profile.d目录的配置文件中搜集shell的设置,为系统的每个用户设置环境信息。 2)用户配置文件~/.bash_profile,每个用户专用于自己使用的shell信息,仅用户登录时执行一次! 默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件。 3)~/.bashrc文件包含专用于用户bash shell的bash信息,登录及每次打开新的shell时都会执行。里面又会调用/etc/bashrc27
  • 28. 设置用户自己的环境变量在/home/user/.bash_profile中定义下句,会怎样? alias la=‘ls –a|grep “\.*”’ 答:user下次再登陆,其shell会自动建立一个别名命令la,功能为查看当前目录下名字以.开头的文件。 写在~/.bash_profile中,需重新登录才能有效。除非运行source .bash_profile使其立即有效。 写在~/.bashrc中,则打开新的终端中就有效 读脚本,了解更多配置文件 读etc/rc.d目录下的系统启动运行的脚本,可以了解/etc下的各种配置文件的作用、如何修改、修改后有什么效果等等。28
  • 29. 利用环境变量,运行Shell程序的另一种方法: 修改脚本文件使其具有可执行权限。 把脚本所在目录添加到搜索路径中(.bash_profile 文件)。 最后,在任意目录下键入“脚本程序名”回车即可执行。 在用户的~/.bash_profile文件中PATH环境变量一般默认为 PATH=$PATH:$HOME/bin 因此,用户只要在自己的主目录下建立一个名为bin的目录,并把编辑好的shell文件都存在该目录下即可。这样脚本程序在任何目录都能执行,并且也符合linux文件系统层次规范,对文件进行分类管理。 29
  • 30. 2)SHELL预定义变量常用于SHELL参数检测的有 $# 命令行参数个数 $* “参数1 参数2…”形式保存的参数 $@ “参数1”“参数2”…形式保存的参数 $n 第n个参数 $0 当前程序名 $? 前一个命令或函数的返回码 $$ 本程序的PID $! 上一个命令的PID30
  • 31. 使用shell预定义变量的脚本举例31
  • 32. 3)用户变量由用户定义的由子母、下划线组成,第1个字符不能是数 无须声明,直接赋值即声明了变量。两种赋值方式: 第一、从标准输入设备读入用户输入的值 read 变量1 [变量2 …] read a b 第二,将一个命令执行的输出赋给指定的变量 用户变量=`命令` dt=`date` 32
  • 33. 使用变量的格式要求 a=morning echo “good ${a}!” unset a unset 变量名 清空变量的赋值 readonly 变量名 设置为只读,即成常数 local 变量名 变量默认是全局作用,加local会限制为局部注意赋值不要有空格 使用变量时,变量名最好用{}括起,变量名前必须加$符号。 灵活用echo显示变量的值方便调试脚本33
  • 34. 默认赋值是字符串的,声明数字或数组需加declare declare –参数 变量名=值 declare –i a=8 -i integer -a array -f function -r readonly -x 通过环境输出变量 又如 declare –i a=8 declare –i b=8 declare –i c c=${a}*${b} echo $c 注意变量别少$,c不定义会得不到数值6434
  • 35. 4)变量表达式条件判断命令test test n1 -参数 n2(或 –参数 表达式) 真返回0,假返回1。 整数,比较运算符见右表 test 1 –lt 4 #判断1<4 echo $? #结果为0 ·test语句的等价形式[ 1 –lt 4 ] 可用中括号代替test,把表达式括起来实现判断 注意表达式与中括号间有空格。 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于 -eq 等于 -ne 不等于35
  • 36. 5、判断文件 -f 存在且是普通文件 -d 存在且是目录 -s 存在且字节数大于0 -r 存在且可读 -w 存在且可写 -x 存在且可执行 如:test -d “mydoc” 判断mydoc是否是目录3、字符串 = 等于 != 不等于 -z 字符串长=0 -n 字符串长>0 4、其他参数 -a 逻辑与 -o 逻辑或 ! 逻辑非 36
  • 37. 3、控制流程shell运算符和C语言基本类似,也有分支、循环流程控制。 简单举例 后面例子涉及的命令 seq命令:产生1-9的数字序列 expr命令:对表达式求值 []直接求值命令:对被括起来的表达式求值 37
  • 38. 1)分支结构if分支 if [ $# -eq 0 ] then echo “输入了0个参数” elif [ $# -lt 1 ] then echo “输入了多个参数” else echo “输入了1个参数” fi case case “$#” in 0) echo “输入了0个参数” ;; 1) echo “输入了1个参数” ;; *) echo “输入了多个参数”;; esac 每个分支条件后必须以两个分号结尾38
  • 39. 2)循环结构for 例子——输出100内10的倍数 for i in `seq 1 9` do echo `expr $i \* 10` done 或写 echo $(expr $i \* 10) 乘号前加转义符, 与数字间要有空格。39
  • 40. read 变量1 [变量2 …] 可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。 如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空; 如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。40
  • 41. read a b for i in `seq $a $b` do echo `expr $i \* 10` done 输出a到b序列数各数的10倍数41
  • 42. while例子——求1到100的和 i=1 sum=0 while [ $i –le 100 ] do sum=$[$sum+$i] i=$[$i+1] done echo $sum [ ]:直接求值命令42
  • 43. 4、命令结果重定向1 stdout标准输出 2 stderr标准错误 输出重定向到文件file,终端上只能看到标准错误: #命令 >file 错误重定向到文件file ,终端上只能看到标准输出: #命令 2>file 标准输出和标准错误都重定向到file,终端上看不到任何信息: #命令 >file 2>&1 (等于#命令 1>file 2>&1) 43
  • 44. 屏蔽命令任何输出的:>/dev/null 2>&1cp /etc/my.conf >/dev/null 2>&1 /dev/null 空设备 此句命令的结果是: cp命令没有目标文件,应该输出错误。 2>&1表示错误重定向指向标准输出。 >/dev/null又使标准输出重定向到空,就是不要输出信息 即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。44
  • 45. 1)command >file 2>file 2)command >file 2>&1 有什么区别?       1)的写法,stdout和stderr都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。       2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。       从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。 還可以: 命令 2>file >&2 命令 &>/dev/null 45
  • 46. * 有趣的IO Redirection $ cat < file > file 文件內容会被洗掉 $ cat file 此处会没有内容 stdout、stderr 的管道先准备好才会从 stdin读内容 > file 会先清空 file,然後才读进 < file ,但此时file已被清空, 因此再重定位读进file的为空 最后cat显示的file就成空了 46
  • 47. 5、脚本实例编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在? 编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。 编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。 编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。 编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。 编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。 47
  • 48. #! /bin/sh - fname=/bin/date if (test –f “$fname”) then echo “exist” fi 说明: 在shell程序中经常需要判断所处理的文件是否存在。本程序采用if语句的简单格式测试date文件,如果存在,则显示相关信息,否则退出if语句。①判断/bin目录下date文件是否存在48
  • 49. #! /bin/sh - hour=`date|cut –c 10-11` if test “$hour” –ge 0 –a “$hour” –le 11; then echo “Good morning!” elif test “$hour” –ge 12 –a “$hour” –le 17; then echo “Good afternoon!” else echo “Good evening!” fi 说明: 第一个有效语句是将命令执行的结果赋给hour变量,所以用反向单引号。 用cut命令从date命令的输出中切割出“小时”信息;这里-c 10-11选项表示只切割10到11列。 这个程序使用了if连用格式,也可以使用if完整格式的嵌套形式。②根据系统当前的时间向用户输出问候信息49
  • 50. #! /bin/sh - if test $# -ne 1 then echo "Incorrect number of arguments" echo "Usage: ifuser username" else user=$1 if who | grep –q $user ; then echo $1 "user is logged on." exit 0 else echo $1 "user is not logged on." exit 1 fi fi③判断用户是否已经在系统中登录50
  • 51. 说明: (1)由于who | grep $user不是表达式而是命令组合,所以不需要test语句测试;如果命令组合执行成功,即找到指定的用户名则返回码为0;否则为非0。 (2)在这个程序中使用了grep字符串搜索命令和“|”管道命令 (3)用grep 命令–q选项来禁止显示搜索到的信息。 (4)还使用了exit命令,以终止shell程序的执行。exit 0表示程序终止后返回0值,而exit 1表示程序终止后返回非0的值。51
  • 52. ④简单的菜单功能#! /bin/sh - clear echo " -----------------MENU------------------" echo echo " 1.Find files modified in last 24 hours" echo " 2.The free disk space" echo " 3.Space consumed by this user" echo " 4.Exit" echo echo -n " Select:" read choice case $choice in 1)find $HOME -mtime -1 -print;; 2)df;; 3)du -s $HOME;; 4)exit;; *)echo "Invalid option" esac52
  • 53. 说明: (1)本程序菜单的第一项是显示/home目录下,最近24小时内所有修改过的文件。命令中的-1参数是数字“1”,表示一天(24小时)。第二项是检查磁盘空间。第三项是显示/home目录下文件的大小,命令中的-s选项是为了仅显示总计。第四项是退出程序。 (2)为了使程序美观,用echo –n实现输入的选择数字不换行。 (3)输入的数字不在1-4范围内时,显示无效的选项信息。53
  • 54. #! /bin/sh - for file in *.txt do leftname=`basename $file .txt` mv $file $leftname.doc done 说明: (1)在Linux系统中不支持mv *.txt *.doc这样的更名命令形式,如果需要将文件成批地更名最好编写一个shell脚本文件。 (2)在for语句的参数列表中使用了“*”通配符。 (3(在程序中用到basename命令,该命令从随后的文件名剥去指定的后缀。⑤将当前目录下所有的.txt文件更名54
  • 55. #! /bin/sh – if test $# -ne 1 then echo “Usage: chuser username” else user=”$1” until who |grep “$user”>/dev/null do sleep 300 done echo “$user has logged on!” fi 说明: (1)如果没有从命令行输入用户名,则测试$# -ne 1为“真”,显示用法提示信息。 (2)程序中until语句的expression(循环条件)是who|grep “$user”命令执行的返回码,如果没有找到指定的用户名,返回码为非0(为“假”),则用sleep命令暂停执行程序5分钟;找到后返回码为0(为“真”),则终止循环并显示该用户已经登录的信息。 (3)采用重定向到/dev/null空文件的目的是不显示查找到的用户其他信息。⑥每隔5分钟检查指定的用户是否登录系统55
  • 56. 实验8.1关键代码提示 1)checkuser a=`cut -d: -f1 /etc/passwd | grep -c “^$1$”` if [ $a -gt 0 ] 2)printnumber 判断参数是否是数 a=$(echo $1|bc 2>/dev/dull) if [[ $a != $1 ]] $1参数不是数 bc计算器,进制转换命令可自学:4个linux筛选数据常用工具cut, grep, awk, sed 56
  • 57. 截取小数点前后的子串${变量名匹配模式} 截掉匹配子串后剩余字符串是结果 str1=${a%%.*} str2=${a##*.} #从左向右,%从右向左 搜索最长匹配符号写两次,最短匹配写1次 $ MYVAR=foodforthought.jpg $ echo ${MYVAR##*fo} rthought.jpg $ echo ${MYVAR#*fo} odforthought.jpg $ MYFOO="chickensoup.tar.gz" $ echo ${MYFOO%%.*} chickensoup $ echo ${MYFOO%.*} chickensoup.tar指定字符偏移和长度截出子串 $ EXCLAIM=cowabunga $ echo ${EXCLAIM:0:3}  cow #从第一个字符开始,截3个字符 $ echo ${EXCLAIM:3:7} abunga #从第四个字符开始,截7个字符 57
  • 58. 作 业 练习本课件给出的例子。熟练vi编辑器,熟悉脚本语法。 实验8.1 58
  • 59. 更多练习练习vi编辑器的使用并熟练掌握它。 简要说明shell的功能,常用的shell有哪些? 查看系统PATH环境变量,了解可执行文件的路径信息 如何实现用系统当前日期和时间作为第一级提示符? 如何实现用alias命令将cp命令设置别名为copy? 简要说明shell程序的结构。 简要说明运行shell脚本程序的几种方法。 如果你希望编写的脚本程序在任何一个目录下都能直接执行(输入程序名后回车),则应该如何处理?59
  • 60. 变量的赋值方式有几种?各用在哪些场合? 写出几个与命令行参数有关的变量并简要说明如何在脚本中引用。 以下shell脚本文件存在什么错误? echo what month is this? read $month echo $ month is as good a month as any. 编写一个shell程序,它输出一个1到10之间的平方和立方对照表。 编写一个名为reverse的shell程序,将输入的若干个命令行参数以逆序输出。 用其它循环语句编程实现本题的功能。60
  • 61. 编写一个shell脚本程序,它能根据输入的命令行参数采取不同的动作:如果是目录,则列出该目录中的文件;如果是可执行的文件,则用shell执行之;如果是可读的文件,则分屏显示其内容。 编写一个求平方和求立方的函数,在shell程序中调用它实现第十四题的功能。 编写一个弹出式菜单的shell程序并实现其简单的菜单功能: ************************************************ * MENU * * 1.copy 2.rename * * 3.remove 4.find * * 5.exit * ************************************************ 即用户按下数字1,则提示用户输入源和目的文件名后执行复制;输入数字2,则提示用户输入要更名的文件或目录名后执行更名操作;输入数字3和4分别执行删除和查找操作;输入数字5,则退出该菜单shell程序的执行。61