《计算机导论Shell编程课件》由会员分享,可在线阅读,更多相关《计算机导论Shell编程课件(47页珍藏版)》请在金锄头文库上搜索。
1、第9章shell程序设计计算机导论Shell编程9.1shell概述命令解释程序高级程序设计语言计算机导论Shell编程第一个bash程序n#!/bin/bash#这个程序将打印“HelloWorld”到屏幕上echoHelloWorldn$chmodu+x./hello.shn$./hello.sh计算机导论Shell编程更有用的程序n$mkdirtrash$mv*trash$rm-rftrash$mkdirtrashn#!/bin/bashmkdirtrashmv*trashrm-rftrashmkdirtrashechoDeletedallfiles!计算机导论Shell编程注释n以“#
2、”开头n第一行(“#!/bin/bash”)除外计算机导论Shell编程9.2shell变量n所有变量的取值都是一个字符串n可以现定义、现赋值n例子:#!/bin/bashx=12echoThevalueofvariablexis$x计算机导论Shell编程使用shell变量nshell变量的变量名是以字母或下划线开头的字母、数字和下划线的字符序列,字母区分大小写。n定义变量并赋值的一般形式是:变量名=变量值n用$var的形式来引用名为var的变量的值计算机导论Shell编程两种shell变量n环境变量:永久性变量,其值不会随shell程序执行结束而消失。n本地变量:在shell程序内部定义的
3、,其使用范围仅限于定义它的程序,出了程序就不能再用计算机导论Shell编程使用shell变量(深入)n设置一个变量只读:readonly变量名n将一局部变量提供给shell执行的其他命令使用:export变量名计算机导论Shell编程9.3控制性结构nif语句nwhile语句nuntil语句nfor语句ncase语句计算机导论Shell编程9.3.1 if语句n基本格式是:if 命令then命令组1else命令组2fi计算机导论Shell编程例子n#!/bin/bashif test -f /etc/foothen# 文件存在,则拷贝文件然后打印出一个信息cp /etc/foo .echo D
4、one.else# 文件不存在,则打印出一个信息然后离开echo This not exist.exitfi计算机导论Shell编程test命令n-d检查此file是否是一个目录-e检查此file是否存在-f检查此file是否为一般的文件-g检查此file是否有SGID权限-r检查此file是否可以读取-s检查此file大小是否不为0-u检查此file是否有SUID权限-w 检查此file是否可以写入-x检查此file是否可以执行计算机导论Shell编程test的另外写法nif test -f /etc/foothennif -f /etc/foo ; then计算机导论Shell编程9.3.
5、2 while语句n语法格式while 命令do命令组 done计算机导论Shell编程例子n#!/bin/bashwhile true; do # while :; doecho “Press CTRL-C to quit.”donen#!/bin/bashx=0;# 设定 x 初值为 0while $x -le 10 ; doecho Current value of x: $x# 增加 x 的数值:x=$(expr $x + 1)sleep 1done计算机导论Shell编程检查条件n检查在数值之间的比较:x -eq y检查x和y是否相等x -ne y检查x和y是否不相等x -gt y检
6、查x是否大于yx -lt y检查x是否小于yn检查在字符串之间的比较:x = y检查x与y是否相同x != y检查x与y是否不相同-n x若x不是空字符串(null)则为真-z x若x是空字符串(null) 则为真计算机导论Shell编程9.3.3 until语句n命令格式until 命令do命令组 done计算机导论Shell编程例子n#!/bin/bashx=0until $x -ge 10 ; doecho Current value of x: $xx=$(expr $x + 1)sleep 1done计算机导论Shell编程9.3.4 for语句nfor语句的结构是:for 变量 i
7、n 参数1 参数2 参数ndo命令组 done计算机导论Shell编程例子n#!/bin/bashecho -n “Checking system for errors”for dots in 1 2 3 4 5 6 7 8 9 10; doecho -n “.”echo “System clean.”donen#!/bin/bashfor x in paper pencil pen; doecho “The value of variable x is: $x”sleep 1done计算机导论Shell编程更实用的例子n要求:给当前目录里的所有文件加后缀名“.html”#!/bin/bash
8、for *; doecho “Adding .html extension to $file.”mv $file $sleep 1done计算机导论Shell编程9.3.5 case语句n语法格式:case 变量 in模式 1)命令组1;模式 2)命令组2;模式 n)命令组nnesac计算机导论Shell编程例子n#!/bin/bashx=5 # 设定 x 初值为5# 现在检查 x 的数值:case $x in0) echo “Value of x is 0.”;5) echo “Value of x is 5.”;9) echo “Value of x is 9.”;*) echo “Unr
9、ecognized value.”esac计算机导论Shell编程9.4 引 号n双引号(double quote) ”n单引号(forward quote)n反单引号(back quote)计算机导论Shell编程双引号n$ mkdir hello world$ mkdir “hello world”计算机导论Shell编程单引号n例:#!/bin/bashx=5 # 设定 x 初值为 5# 使用双引号echo “Using double quotes, the value of x is: $x”# 使用单引号echo Using forward quotes, the value of
10、x is: $x计算机导论Shell编程反单引号n例:x=$(expr $x + 1)x=expr $x + 1计算机导论Shell编程9.5 算 术 运 算nexpr命令n$(.)n例子:#!/bin/bashx=8# 设定x初值为8y=4# 设定y初值为4# 现在我们将x和y的总合之值设定到z:z=$($x + $y)echo “The sum of $x + $y is $z”计算机导论Shell编程其它运算n 运 算 运算符Addition /加 +Subtraction / 减-Multiplication / 乘*Division / 除 /Modulus / 取余%计算机导论Sh
11、ell编程9.6 读取使用者输入nread命令n例子:#!/bin/bash# 取得到使用者的名字,打印出问候语echo -n “Enter your name:”read user_nameecho “Hello $user_name!”计算机导论Shell编程9.7 函 数n#!/bin/bash# 函数 hello() 只是打印出一个信息hello()echo “You are in function hello()”echo “Calling function hello().”# 调用 hello() 函数:helloecho “You are now out of function
12、 hello()”计算机导论Shell编程9.8 TRAPPINGntrap使用下列的语法:trap action signaln信号量1)SIGHUP2)SIGINT (ctrl+c)3)SIGQUIT (Ctrl+)9)SIGKILL(kill)15) SIGTERM(shutdown) Signal Value Action Comment - SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard
13、 SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term Broken pipe: write to pipe with no readers SIGALRM 14 Term Timer s
14、ignal from alarm(2) SIGTERM 15 Term Termination signal SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2 SIGCHLD 20,17,18 Ign Child stopped or terminated SIGCONT 19,18,25 Cont Continue if stopped SIGSTOP 17,19,23 Stop Stop process SIGTSTP 18,20,24 Stop Stop type
15、d at tty SIGTTIN 21,21,26 Stop tty input for background process SIGTTOU 22,22,27 Stop tty output for background process计算机导论Shell编程例子n#!/bin/bash# 使用trap命令 # trap CTRL-C执行sorry()函数:trap sorry INT # 函数sorry()打印出一个信息sorry()echo “Im sorry Sir. I cant do that.”sleep 3# 从 10 数到 1:for i in 10 9 8 7 6 5 4
16、3 2 1; doecho “$i seconds until system failure.”sleep 1doneecho “System failure.”计算机导论Shell编程9.9 AND & ORn条件1 & 条件2n条件1 | 条件2n例子:#!/bin/bashx=5y=10if “$x” -eq 5 & “$y” -eq 10 ; thenecho “Both conditions are true.”elseecho “The conditions are not true.”fi计算机导论Shell编程9.10 使 用 参 数n$0 . $9 $#n#!/bin/bas
17、h# 打印第一个参数# 首先检查是否有一个参数:if “$#” -ne 1 ; thenecho “usage: $0”fi echo “The argument is $1”计算机导论Shell编程环境参数变量n位置参数变量位置变量的数目有可以任意多,但只有$0-$9可以被访问$0$1$2$3$4$5$6$7$8$9($0的值为脚本名)echoDidYouSeeTheFullMoonn特定参数变量(7个)$#传递到脚本的参数的个数$*以一个单字符串显示所有向脚本传递的参数。$脚本运行的当前进程ID号$!最后一个后台运行的进程的进程ID号$与$#相同,但是使用时加引号,并在引号中返回每个参数(
18、返回一个参数列表)$-显示shell使用的当前选项,与set命令功能相同$?显示前面最后一个命令的退出状态。0表示没有错误,其他任何值表明有错误。计算机导论Shell编程9.11 临时文件n“ $”符号n$ touch hello.$计算机导论Shell编程9.12 返 回 值n$?变量n例子 #!/bin/bash# grep 使用者 foobar,并用导引所有输出到/dev/null:grep “foobar” /dev/null 2&1# 抓取返回值,并且做些动作:if “$?” -eq 0 ; thenecho “Match found.”exitelseecho “No match
19、found.”fi计算机导论Shell编程用户程序返回值的例子n例:#!/bin/bashif -f “/etc/passwd” ; thenecho “Password .”exit 0elseecho “No such file.”exit 1fi计算机导论Shell编程函数返回值的例子check_passwd()# 检查是否passwd文件存在:if -f “/etc/passwd” ; thenecho “Password .”# 有找到,传回一个0值:return 0else# 找不到,传回一个1值:echo “No such file.”return 1fi# # 从从函函数数ch
20、eck_passwdcheck_passwd取取得得返返回回值:值:foo=check_passwdfoo=check_passwd# # 检查数值:检查数值:if “$foo” -eq 0 ; thenif “$foo” -eq 0 ; thenecho “.”echo “.”exit 0exit 0elseelseecho “No such file.”echo “No such file.”exit 1exit 1fi fi 计算机导论Shell编程完整例子锁终端n#bin/bashn#lockitn#trapsignals2,3and15ntrapnice_try2315n#getth
21、edevicewearerunningonnTTY=ttynnice_try()nn#nicetrynechoNiceTry,theterminalstayslockednn#savesttysettingshidecharacterstyped#inforthepasswordn#+!nhC4=jdvP,n#将选项设置输出到变量nSAVEDSTTY=stty-gn#不回显nstty-echonecho -n Enter your password to lock$TTY:nreadPASSWORDnclearnwhile:ndo#read from tty only!read RESPONS
22、Ev $TTYif $RESPONSE = PASSWORD then#password matches.unlockingecho unlocking.breakfi#show this if the user inputs a wrong password or hits returnecho wrong password and terminal is locked.donerestore stty settingsstty $SAVEDSTT计算机导论Shell编程彩色脚本n显示前景或背景颜色格式为:n background_number;foreground_number mn要产生
23、一个黑色背景加绿色前景色:nEchoe“03340;32m”计算机导论Shell编程1.前景色:数字颜色数字颜色30黑色34蓝色31红色35紫色32绿色36青色33黄(或棕)色37白(或灰)色计算机导论Shell编程2.背景色:40黑色44青色41红色45蓝色42绿色46青色43黄(或棕)色47白(或灰)色计算机导论Shell编程恢复正常屏幕n#把色彩重设为常规.ntputsgr0计算机导论Shell编程tput 常用字符串参数名字含义bel警铃blink闪烁模式bold粗体civis隐藏光标clear清屏cnorm不隐藏光标cup移动光标到屏幕位置(x,y)el清除到行尾ell清除到行首smso启动突出模式rmso停止突出模式smul开始下划线模式rmul结束下划线模式sc保存当前光标位置rc恢复光标到最后保存位置sgr0正常屏幕rev逆转视图计算机导论Shell编程