3.shell中引L(fng)使用Ҏ(gu) shell使用引号(单引?双引?和反斜线("\")用于向shell解释器屏蔽一些特D字W? 反引?")对shell则有Ҏ(gu)意义. ? abc="how are you" (bash/pdksh) set abc = "how are you" (tcsh) q个命o(h)行把三个单词l成的字W串how are you作ؓ(f)一个整体赋值给变量abc. abc1='@LOGNAME,how are you!' (bash/pdksh) set abc1='$LOGNAME,how are you!' (tcsh) abc2="$LOGNAME,how are you!" (bash/pdksh) set abc2="$LOGNAME,how are you!" (tcsh) LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后, abc1的内Ҏ(gu):$LOGNAME, how are you!.而abc2的内Ҏ(gu);wang, how are you!. 象单引号一?反斜U也能屏蔽所有特D字W?但是他一ơ只能屏蔽一个字W?而不能屏?br />一l字W? 反引L(fng)功能不同于以上的三种W号.他不h屏蔽Ҏ(gu)字符的功?但是可以通过他将 一个命令的q行l果传递给另外一个命? ? contents=`ls` (bash/pdksh) set contents = `ls` (tcsh) 4.shellE序中的test命o(h) 在bash/pdksh?命o(h)test用于计算一个条件表辑ּ的?他们l常在条件语句和循环 语句中被用来判断某些条g是否满. test命o(h)的语法格? test expression 或?br />[expression]
(1)for语句 大家知道在很多编E语a中for语句是最常见.在shell中也不例?for语句要求shell包?br />在这个语句中的一l命令连l执行一定的ơ数. 语法格式: bash/pdksh 用法1: for var1 in list do commands done 含义:在这个for语句?对应于list中的每个?shell执行一ơcommands代表的一l命? 在整个@环的每一ơ执行中,变量var1依此取list中的不同的? 用法2: for var1 do setatements done 含义:在这个for语句?shell针对变量var1中的每一分别执行一ơstatements代表的一l?br />命o(h).当用这UŞ式的语句?shell认ؓ(f)var1变量中包含了(jin)所有的位置变量,而位|变量中 存放着E序的命令行参数?也就是说,他等价于下列形式: for var1 in " $@" do statements done
tcsh用法: 在tcsh中没有forq个单词,与for语句起同样功能的是foreach语句 foreach name (list) commands end
举例: for file ;bash/pdksh do tr a-z A-Z<$file>file.caps done
(2)while语句 while语句是shell提供的另一U@环语? while语句指定一个表辑ּ和一l命?q个 语句使得shell重复执行一l命?直到表达式的gؓ(f)False为止. 语法格式: while expression ;bash do statements done
while (expression) ;tcsh statements end 举例: count=1 ;bash while [ -n "$ *"] *** do echo "this is a parameter number $count $1" shift count='expr $count + 1' done
set count = 1 ;tcsh while ( " $ * " ! = "") echo "this is a parameter number $count $1" shift set count = 'expr $count + 1' end
语句中shift命o(h)的功能是所有的命o(h)行参Cơ相左传?
(3)until语句 until与while语句hcM的语法格式和功能,不同的是while中expression的gؓ(f)True? shell执行命o(h)l?而until中当expression的gؓ(f)False?shell才执行那l命? 语法格式: until expression do commands done 举例: count=1 until [ -z " $ * "] *** echo "this is a parameter number $count $1" shift count='expr $count + 1' done 情注意上qC子中?**?在while中的表达? -n string,他的含义是当string不是I?br />字符串时,表达式的gؓ(f)True;在until中的表达? -z string,他的 含义是当string是空 字符串时,表达式的gؓ(f)True.由此可见,两个E序Ҏ(gu)件表辑ּ的设|恰好是相反?
(4)shift语句 bash和tcsh都支持shift命o(h).shift存攑֜位置变量中的命o(h)行参?依次向左传?例如 位置变量当前gؓ(f): $1=file1 $2=file2 $3=file3 执行一ơshift命o(h)?位置变量的gؓ(f): $1=file2 $2=file3 q可以在shift命o(h)中指定位|变量{Uȝơ数, ? shift n 例子: while [ "$1"] do if [ "$1"="-i"] then infile=" $2" shift 2 else if [ "$1"="-o"] then outfile="$2" shift 2 else echo "Program $0 does not recognize option $1" fi done tr a-z A-Z<$infile>$outfile
(5)select语句 select语句是pdksh提供的一个独特的循环语句.他不同于前面介绍的@环语?他不?br />反复计算一个条件表辑ּ,q依据表辑ּ的值决定是否执行一l命?select的功能是自动?br />生成一个简单的文本菜单. 语法格式: select menu [in list_of_items] do commands done 含义:当执行一个select语句?pdksh分别为每个列在list_of_items中的成员建立一个菜?br />选项.list_of_items既可以是一个包含多个选项的变?也可以是直接列在E序中的一l选项 .如果语句中没有提供list_of_items,select语句用位|变量作为list_of_items. 举例: select menuitem in pick1 pick2 pick3 do echo "are you sure you want to pick $menuitem" read res ;接收用户的输?q且输入的值存攑֜特定变量? if [ $res=" y" -o $res=" Y"] then break ;用于退出while,for,select{@环语?br />fi done (6)repeat语句 repeat语句是tcsh提供的独有的循环语句.使用repeat命o(h)要求shell对一个命令执行一?br />的次? 语法格式: repeat count command ? foreach num ( $ *) repeat $num echo -n " *" echo " " end
7.shell中的函数 shell允许用户定义自己的函?函数是高U语a中的重要l构.shell中的函数于C或者其?br />语言中定义的函数一?与从头开?一行一行地写程序相?使用函数主要好处是有利于l织 整个E序.在bash?一个函数的语法格式如下: fname (){ shell comands } 定义好函数后,需要在E序中调用他?bash中调用函数的格式: fname [parm1 parm2 parm3...] 调用函数?可以向函C递Q意多个参?函数这些参数看做是存放他的命o(h)行参数的 位置变量. 举例: q个E序定义?个函? upper ():传递给他的文g中的字母转换成大?q存攑ֈ同名的结ؓ(f).out的文件中. lower ():传递给他的文g里的字母转换成小?q存攑ֈ同名的结ؓ(f).out的文件中. print ():输出传递给他的文g的内? usage_error ():输出E序的帮助信? E序的主模块是个case条g语句,他根据命令行中第一个参?军_E序要完成的功能,q调用相?br />的函数完成这一功能. upper (){ shift for i do tr a-a A-Z<$!>$1.out rm $1 mv $1.out $1 shift done; } lower () { shift for i do tr A-Z a-z<$1>$1.out rm $1 mv $1.out $1 shift done; } print() { shift for i do lpr $1 shift done; } usage_error() { echo " $1 syntax is $1<option><input files>" echo "" echo " where option is one of the following" echo " p--to print frame files" echo " u--to save as uppercase" echo " l--to save as lowercase";} case $1 in p | -p)print $@;; u | -u)upper $@;; l | -l)lower $@;; *) usage_error $0;; esac