3.shell中引號的使用方法 shell使用引號(單引號/雙引號)和反斜線("\")用於向shell解釋器屏蔽一些特殊字元. 反引號(")對shell則有特殊意義. 如: abc="how are you" (bash/pdksh) set abc = "how are you" (tcsh) 這個命令行把三個單片語成的字元串how are you作為一個整體賦值給變數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變數,假設他的當前值是ang.執行完兩條命令后, abc1的內容是:$LOGNAME, how are you!.而abc2的內容是;wang, how are you!. 象單引號一樣,反斜線也能屏蔽所有特殊字元.但是他一次只能屏蔽一個字元.而不能屏蔽 一組字元. 反引號的功能不同於以上的三種符號.他不具有屏蔽特殊字元的功能.但是可以通過他將 一個命令的運行結果傳遞給另外一個命令. 如: contents=`ls` (bash/pdksh) set contents = `ls` (tcsh) 4.shell程序中的test命令 在bash/pdksh中,命令test用於計算一個條件表達式的值.他們經常在條件語句和循環 語句中被用來判斷某些條件是否滿足. test命令的語法格式: test expression 或者 [expression]
(1)for語句 大家知道在很多編程語言中for語句是最常見.在shell中也不例外.for語句要求shell將包含 在這個語句中的一組命令連續執行一定的次數. 語法格式: bash/pdksh 用法1: for var1 in list do commands done 含義:在這個for語句中,對應於list中的每個值,shell將執行一次commands代表的一組命令. 在整個循環的每一次執行中,變數var1將依此取list中的不同的值. 用法2: for var1 do setatements done 含義:在這個for語句中,shell針對變數var1中的每一項分別執行一次statements代表的一組 命令.當使用這種形式的語句時,shell認為var1變數中包含了所有的位置變數,而位置變數中 存放著程序的命令行參數值.也就是說,他等價於下列形式: for var1 in " $@" do statements done
tcsh用法: 在tcsh中沒有for這個單詞,與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提供的另一種循環語句. while語句指定一個表達式和一組命令.這個 語句使得shell重複執行一組命令,直到表達式的值為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命令的功能是將所有的命令行參數依次相左傳遞.
(3)until語句 until與while語句具有類似的語法格式和功能,不同的是while中expression的值為True時, shell執行命令組;而until中當expression的值為False時,shell才執行那組命令. 語法格式: until expression do commands done 舉例: count=1 until [ -z " $ * "] *** echo "this is a parameter number $count $1" shift count='expr $count + 1' done 情注意上述例子中帶***號.在while中的表達式: -n string,他的含義是當string不是空 字元串時,表達式的值為True;在until中的表達式: -z string,他的 含義是當string是空 字元串時,表達式的值為True.由此可見,兩個程序對條件表達式的設置恰好是相反的.
(4)shift語句 bash和tcsh都支持shift命令.shift將存放在位置變數中的命令行參數,依次向左傳遞.例如 位置變數當前值為: $1=file1 $2=file2 $3=file3 執行一次shift命令后,位置變數的值為: $1=file2 $2=file3 還可以在shift命令中指定位置變數轉移的次數, 如: 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提供的一個獨特的循環語句.他不同於前面介紹的循環語句.他不是 反覆計算一個條件表達式,並依據表達式的值決定是否執行一組命令.select的功能是自動的 生成一個簡單的文本菜單. 語法格式: select menu [in list_of_items] do commands done 含義:當執行一個select語句時,pdksh分別為每個列在list_of_items中的成員建立一個菜單 選項.list_of_items既可以是一個包含多個選項的變數,也可以是直接列在程序中的一組選項 .如果語句中沒有提供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 ;接收用戶的輸入,並且將輸入的值存放在特定變數里. if [ $res=" y" -o $res=" Y"] then break ;用於退出while,for,select等循環語句 fi done (6)repeat語句 repeat語句是tcsh提供的獨有的循環語句.使用repeat命令要求shell對一個命令執行一定 的次數. 語法格式: repeat count command 如; foreach num ( $ *) repeat $num echo -n " *" echo " " end
7.shell中的函數 shell允許用戶定義自己的函數.函數是高級語言中的重要結構.shell中的函數於C或者其他 語言中定義的函數一樣.與從頭開始,一行一行地寫程序相比,使用函數主要好處是有利於組織 整個程序.在bash中,一個函數的語法格式如下: fname (){ shell comands } 定義好函數后,需要在程序中調用他們.bash中調用函數的格式: fname [parm1 parm2 parm3...] 調用函數時,可以向函數傳遞任意多個參數.函數將這些參數看做是存放他的命令行參數的 位置變數. 舉例: 這個程序定義了4個函數: upper ():將傳遞給他的文件中的字母轉換成大寫,並存放到同名的結尾為.out的文件中. lower ():將傳遞給他的文件里的字母轉換成小寫,並存放到同名的結尾為.out的文件中. print ():輸出傳遞給他的文件的內容. usage_error ():輸出程序的幫助信息. 程序的主模塊是個case條件語句,他根據命令行中第一個參數,決定程序要完成的功能,並調用相應 的函數完成這一功能. 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" 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