《Shell Script编辑的补充课件》由会员分享,可在线阅读,更多相关《Shell Script编辑的补充课件(17页珍藏版)》请在金锄头文库上搜索。
1、Shell Script编辑的补充,一变量 二、 bash的内部命令 三、 Shell脚本的控制流程 举例,2,1由命令取得变量值 由于反引号“”和“$(Shell命令)”可用来将命令的输出结果视为字符串,所以可以利用命令置换的功能来设置变量值。 例如: rootyanling root# NOW=date rootyanling root# echo $NOW Sat May 7 15:45:20 CST 2005 而使用“$(Shell命令)”可以达到同样的效果: rootyanling root# NOW=$(date) rootyanling root# echo $NOW Sat M
2、ay 7 15:48:36 CST 2005,一、变量,3,2使用Shell script统计参数例二 例1:创建一个Shell脚本“dirsize”统计“/usr/bin”中的文件个数,修改“dirsize”文件的权限并执行。 rootyanling root# catdirsize # !/bin/sh ls $1|wc -w rootyanling root# chmod 700 dirsize rootyanling root# ./dirsize /usr/bin 统计“/usr/bin”中的文件个数 rootyanling root# ./dirsize /etc 统计“/etc”
3、中的文件个数,例2:创建一脚本文件显示所有参数及其总数 。 rootyanling root# catshowarg # !/bin/sh echo Argument List:$ echo Argument Number:$# rootyanling root# chmod 700 showarg rootyanling root# ./showarg Hello LYL XWB Hello LYL XWB 显示所有参数 3 显示参数总数,4,3使用环境变量 在脚本文件中,可以直接取用系统中的环境 变量。例如: rootyanling root# catshowuser # !/bin/sh
4、 echo Your userID is: $UID echo Executable path is: $PATH echo Your current directory is: $PWD,4由用户输入 使用read命令可直接读取用户的输入作为变量值。例如,还可以对前面的例3作如下修改。 rootyanling root# catdirsize # !/bin/sh read dirname ls $dirname|wc -w,5,二、 bash的内部命令,1echo # echo -neE arg 功能:在屏幕上显示出由arg指定的字符串,显示多个信息时要用空格隔开。 -n:在显示信息时不自
5、动换行(默认会自动换行)。 -e:显示信息时使用跳脱(Escape)字符,用来指示其后的字符串是格式化选项,而不会当成一般文字输出。 -E:显示信息时不使用跳脱(Escape)字符。,6,2eval # eval args 功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。 3exec # exec命令参数 功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。,7,4export # e
6、xport变量名 或export变量名=变量值 功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。 5readonly # readonly变量名 功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。,8,6read # read变量名表 功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。 7shift语句 功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3
7、成为$2在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。,9,8wait 功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总为真 。 9exit 功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态 。 10. “.”(点) 命令格式:.Shell程序文件名 功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。,10,三、 Shell脚本的控制流程 举例,1数值运算命令 如果需要处理数值运算,可以使用expr命令,其命令格式如下: # expr expression 例
8、如: rootyanling root# expr var1 = 2 rootyanling root# expr var2=var1*10+1 则var2的值为21。,2条件测试命令 test命令用于检查某个条件是否成立,其命令格式如下: rootyanling root# test 表达式 或直接用: rootyanling root# 表达式 3if条件语句,11,3if条件语句 Shell程序中的条件分支是通过if条件语句来实现的,其一般格式为: if expression1 若expression1为真 then commands 则执行这些命令 elif expression2 否
9、则,若expression2为真 then commands 则执行这些命令 else 若以上表达式都不成立 commands 则执行这些命令 fi 结束if语句,例5:创建一个脚本文件,显示当前目录下是否有“readme”文件。 rootyanling root# catshowfile # !/bin/sh if -f readme then echo There is a readme file in current directory. else echo No readme file in current directory. fi,12,4for循环 for语句可以对一个变量的所有
10、可能值都执行一个命令序列。 for循环的一般格式为: for var in list do 对list中的每一个元素var commands 执行这些命令 done 循环语句结束,例6:创建一个脚本文件,显示当前目录下所有.txt文件的名称及内容。,例6:创建一个脚本文件,显示当前目录下所有.txt文件的名称及内容。 rootyanling root# catshowtxtfile # !/bin/sh for file in *.txt 对当前目录下的所有.txt文件 do echo “*” echo $file 显示文件名 echo “*” cat $file 显示文件内容 done,13
11、,5while和until循环 while语句和until语句的语法结构和用途类似,都是用命令的返回状态值来控制循环。,while expression do commands done,until expression do commands done,例7:创建一个脚本文件读入一行正文并显示出来,直到在一行开始读到end为止。 rootyanling root# catreadend # !/bin/sh while true 创建无限循环 do read firstword restofline if test $firstword = end then exit() 退出无限循环 el
12、se echo $firstword $restofline fi done,14,6case条件选择 if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下: case string in 测试string字符串 str1) 若string包含于str1 commands; 则执行这些命令 str2) 若string包含于str2 commands; 则执行这些命令 *) 若string不包含于上述字符串 commands; 则执行这些命令 esac,例8:创建一个简单的安装程序。 rootyanling root# c
13、atinstall # !/bin/sh case $1 in 取得命令行参数 -i) 若参数为-i,则开始安装 echo Beginning of installation process cp bin/* /usr/bin -r -f cp doc/* /usr/share/doc -r -f echo Congratulations! Installation finished. ; -h) 若参数为-h,则显示命令用法 echo *Bennys install lation utility* echo Use $0 -I to install. echo Use $0 -h to sh
14、ow this help message. ; *) echo $0:You must specify one of the options. echo Try $0 -h for more information. ; esac,15,7无条件控制语句 break语句用于立即终止当前循环的执行,而contiune语句用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。 Break和contiune语句都可加上数字参数,以指示要跳出的循环数目。要跳过几层循环,就加上数字;若指定的数字大于最大的循环层数,就跳至最外一层循环执行;若只跳一层,可不加1。,例9:创建一个模拟工业操作流程的脚本文件。 rootyanling root# catjobcontrol # !/bin/sh for x in a b c d e f g h i do for y in 1 2 3 4 5 6 7 8 9 do echo current job is $x$y echo input n to do next job echo s to skip the other jobs in current level echo x to terminate all jobs read action if $action