5 while
迴圈次數的限制
foo=1 //迴圈初值
while [ "$foo" -le 2 ] //le :<= while (foo<=2)
do
echo "ARE YOU THERE"
foo=$(($foo+1)) //這種形式很重要 foo++
done
6 until
until condition
do
statements
done
until 迴圈將反覆執行直到條件為真為止 而,while迴圈是在條件為真時才反覆執行
until who | grep "$1" > /dev/null
do
sleep 600
done
echo -e //a
echo "****$1 has just logged in ****"
exit 0
輸入:/bash/sh yzj
輸出:
-e
****yaozhangjun has just logged in ****
如果將 >/dev/null注釋掉,則是
yzj tty7 2009-10-19 09:59 (:0)
yzj pts/0 2009-10-19 10:00 (:0.0)
-e
****yaozhangjun has just logged in ****
此時才看到/dev/null的資源回收筒作用
7 case
case variable in
pattern [ |pattern ]...) statements ;;
...
esac
其實shell中的case 與C中的switch--case是一樣的
其中順序比較字串,而不會去找首選。
這也就導致了
case "$timeofday" in
*) echo "Sorry,not be recognized";;
yes) echo "Good morning";;
no) echo "Good afternoon";;
y) echo "Good morning";;
n) echo "Good afternoon";;
中無論輸入什麼都將執行sorry的原因
case "$timeofday" in
yes | y |Yes |YES ) echo "Good morning";; //此處的 |不是管道而是邏輯或,要保持距離
n* | N* ) echo "Good afternoon";; //雙引號注意
* ) echo "sorry";;
case "$timeofday" in
[yY] | [yY][eE][sS] )//注意距離 ,如果是 [yY] [eE] [sS]就不行了,為什麼不行的,因為我試過 Syntax error: word unexpected (expecting ")")
echo "Good morning" //對於一種情況下的多條語句,只需在最後一條語句上添加;;即可
echo "Up bright and early this morning";;
2.6.4 函數
1 函式宣告時沒有傳回值,沒有形參類表
2 使用函數時可以直接使用函數名,或者直接帶上實參,不需要括弧
3 local將變數聲明為局部變數
4 通過return 命令讓函數返回數字組,讓函數返回字串值的常用方法是讓函數將字串儲存在一個變數中。
5 echo > fred 的效果和touch fred一樣就是建立一個空檔案
6 while : 代替while true 實現無限迴圈
7 break : 跳出當前迴圈(執行break語句的那個迴圈)
8 continue:跳出本次迴圈(當前迴圈的餘下部分依然執行)
9 . 命令
#classic_set.sh
version=classic
PS1="classic>"
#lastest_set.sh
version=lastest
PS1="lastest version>"
執行命令
$ . ./classic_set.sh
classic>
classic> . lastest_set.sh
lastest version> echo $version
lastest
通過這個實驗我覺得好像是. 代替了/bin/sh 而可以執行命令
10 在bash中 echo -n "hello "來刪除分行符號
11 eval :允許對參數進行求值
foo=10
x=foo
y='$'$x
echo $foo 10
echo $x foo
echo $y $foo
而
foo=10
x=foo
eval y='$'$x 其功能和 y=$(($x))是相同的
echo $foo 10
echo $x foo
echo $y 10
12 exit n
exit命令使指令碼程式一退出碼n結束運行。0表示成功
13 export
export命令將作為他參數的變數匯出到子shell中,並使之在子shellzhong youxiao .export把自己的參數建立為一個環境變數,而這個環境變數可以被其他指令碼和當前程式調用的程式看見。
#export2
echo "$foo"
echo "$bar"
#export1
foo="The first meta-syntactic variable"
export bar="The second meta-syntactic varibale"
export2
執行 $/bin/sh export2 //願書用的是export1,執行後顯示export2 not found
//原本就是空行
The second meta-syntactic varibale //說明bar的值被匯入到exprot2中了,而foo沒有
e1 e2 e3
| | | |
| | | |
|| | |
e2 e3
bar的值到e3依然不變,但是奇怪的是
e1 e2 e3
| | | |
| | ||
|| |
e2 e2
的時候,即便e1和e3中的bar值不同,e2中依然輸出的是e1中的
set -a 或者set -allexport將匯出它之後聲明的所有變數
14 set:為shell設定參數變數,需要使用輸出結果中的某個域
set $(date)
echo The month is $2 //等同於echo $(date +%B)
set用來提取位置參數
15 shift:將所有參數變數左翼一個位置,$3->$2.$4->$3 ,而原來$1的值將會被丟棄
while [ "$1" != "" ];do
echo "$1"
shift
done
執行:
$ /bin/sh shift1 a b c e
a
b
c
e
16 trap :用於在接受到訊號後採取的行動,在指令碼程式被中斷是完成清理工作。
trap command signal
command:接受到指定引號是要採取的行動
signal :處理的訊號名
command 作用
- 重設某個訊號的處理條件到起預設值
'' 忽略某個訊號
就是下面的例子已經將我嚇得一愣一愣的了
trap 'rm -f /tmp/my_tmp_file_$$ ' INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "press interrupt to interrupt ..."
while [ -f /tmp/my_tmp_file_$$ ];do
echo File exists
sleep 1
done
echo The file no longer exists
當執行: /bin/sh trap1的時候
1 creating file /tmp/my_tmp_file_$$ ($$為隨即產生的數)
2 將當時的時間寫入
3 press interrupt to interrupt ...
4 File exists (每隔1妙出現一次)
5 CTRL+C
6 執行 INT 不僅中斷而且將/tmp/my_tmp_file_$$刪除