UNIX SHELL脚本编程( 二 )

【UNIX SHELL脚本编程】name=Johnreadonly结果如下: Tom name: is read only readonly name readonly ......4. 特殊变数有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它 唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这 些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读 的 。以下是一些等殊变数:$0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数$# 这个程式的参数个数$$ 这个程式的PID $! 执行上一个背景指令的PID$? 执行上一个指令的返回值当你执行这个程式时的参数数目超过9 个时,我们可以使用shift 命令将参数 往前移一格,如此即可使用第10个以後的参数 。除此之外,吾人可以用set 命 令改变$n及$*,方法如下:set string 如此$*的值即为string,而分解後则会放入$n 。如果set 命令後面没有参数,则会列出所有已经设定的变数以及其值 。档名:ex1 参数:this is a testecho Filename: $0echo Arguments: $*echo No. of args.: $#echo 2nd arg.: $2shiftecho No. of args.: $#echo 2nd arg.: $2set hello, everyoneecho Arguments: $*echo 2nd arg.: $2结果如下:Filename: ex1Arguments: this is a test No. of args.: 42nd arg.: isNo. of args.: 32nd arg.: aArguments: hello, everyone2nd arg.: everyone值得一提的是,当你想从键盘输入一变数值时,你可以使用下面的命令:read var1 var2..... 这时read会将一个字分给一个变数 。如果输入的字比变数还多,最後一个变数会将 剩下的字当成其值 。如果输入的字比变数还少,则後面的变数会设成空字串 。如果需要处理数值运算,我们可以使用expr命令 。其参数及输出列於附录A 。二、执行命令在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不 同 。1. 直接下命令 这个方式和在命令列中直接下命令的效果一样 。2. 使用sh命令 sh command 这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行 。除此之外和直接下命令的方式一样 。3. 使用"."命令 . command 这时和使用sh命令相似,只不过它不像sh一般会产生新的process,相反地,它会在原有的process 下完成工作 。4. 使用exec命令 exec command 此时这个Script将会被所执行的命令所取代 。当这个命令执行完毕之後,这个 Script也会随之结束 。5. 使用命令替换 这是一个相当有用的方法 。如果想要使某个命令的输出成为另一个命令的参数 时,就一定要使用这个方法 。我们将命令列於两个"`" 号之间,而Shell 会以 这个命令执行後的输出结果代替这个命令以及两个"`" 符号 。str="Current Directory is "`pwd` echo $str结果如下:Current directory is /users/cc/mgtsai这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原 来的`pwd` 设定str 变数,所以str 变数的内容则会有pwd 命令的输出 。number=`expr $number1` 这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而 後输出到标准输出上 。如果要将某变数设定成其值,非得靠命令替换的方 式不可 。这个例子是将number变数的值加1 後再存回number变数 。三、流程控制 在介绍流程控制之前,我们先来看看test命令 。test命令的参数是条件判断式,当 条件为真时则传回非零值,而条件为伪时则传回零 。在所有的流程控制都必须用到 test命令来判断真伪 。而test命令的使用方法则列於附录B 。test $# = 0 如果执行这个程式没有参数时,会传回非零值代表"$# = 0"这个条件成立 。反 之则会传回零 。以下介绍各种流程控制:1. if then 语法以及流程图如下 语法以及流程图如下if(condition)thenthen-commandsficondition 是一个test命令 。往後所介绍的各种流程中的condition 都是test 命令 。档名:chkargif(test$#!=0)thenecho Arg1:$1fi$ chkarg HelloArg1: Hello$ chkarg $2. if then else 语法以及流程图如下if(condition)thenthen-commandselseelse-commandsfi3. if then elif 语法以及流程图如下if(condition1)thencommands1elif(condition2)thencommands2elsecommands3fiecho "Word 1: c"read word1echo "word 2: c"read word2echo "word 3: c"read word3if (test "$word1" = "$word2" -a "$word2" = "$word3")thenecho "Match: words 1, 2, & 3"elif (test "$word1" = "$word2")thenecho "Match: words 1 & 2"elif (test "$word1" = "$word3")then echo "Match: words 1 & 3"elif (test "$word2" = "$word3")thenecho "Match: words 2 & 3"elseecho "No match"fi4. for in 语法以及流程图如下for var in arg-listdocommandsdonefor a in xx yy zzdoecho $adone结果如下:xx yy yy zz5. for 语法以及流程图如下for vardo commandsdone档名:lstargfor adoecho $adone$lstarg xx yy zzxx yy yy zz6. while 语法以及流程图如下while (condition)docommandsdonenumber=0while (test $number -lt 10)doecho "$numberc"number=`expr $number1`doneecho结果如下: 01234567897. until 语法以及流程图如下until (condition)docommandsdone它和while 的不同只在於while 是在条件为真时执行回圈,而until 是在条件 为假时执行回圈 。8. break及continue 这两者是用於for, while, until 等回圈控制下 。break 会跳至done後方执行,而continue会跳至done执行,继续执行回圈 。9. case 语法以及流程图如下case str inpat1) commands1;;pat2) commands2;;pat3) commands3;;esac而pat 除了可以指定一些确定的字串,也可以指定字串的集合,如下* 任意字串? 任意字元[abc] a, b, 或c三字元其中之一[a-n] 从a到n的任一字元| 多重选择echo "Enter A, B, or C: c"read lettercase $letter inA|a) echo "You entered A.";;B|b) echo "You entered B.";;C|c) echo "You entered C.";;*) echo "Not A, B, or C";;esac10. 函数 格式如下 function-name() { commands } 而要呼叫此函数,就像在命令列下直接下命令一般 。□C Shell C Shell 有些特性和Bourne Shell一样,但有些不相同 。这里介绍与Bourne Shell 不相同的地方 。一、变数1. 字串变数 这个部分和Bourne Shell的变数一样,只不过在设定变数值时不能使用Bourne Shell的方式,而必须打:set var=value2. 数字运算 基本上C Shell 没有数字变数,但C Shell 却有简单的方法处理数字运算:@ var operator expressionoperator可以是C 语言中的=,=, -=,......,而expression则是运算式 。运 算式的运算子如下:A. () 改变计算的顺序 ~@B. ~ 位元NOT运算 @~~ ! 逻辑否定C. % 取馀数 C. % 取馀数 / 除 * 乘 - 减加D. >> 右移

推荐阅读