1、 for/do/done?
?
Shell腳本的
for
循環(huán)結(jié)構(gòu)和C語言很不一樣,它類似于某些編程語言的
foreach
循環(huán)。例如:
#! /bin/sh for FRUIT in apple banana pear; do echo "I like $FRUIT" done
FRUIT
是一個循環(huán)變量,第一次循環(huán)
$FRUIT
的取值是
apple
,第二次取值是
banana
,第三次取值是
pear
。再比如,要將當(dāng)前目錄下的
chap0
、
chap1
、
chap2
等文件名改為
chap0~
、
chap1~
、
chap2~
等(按慣例,末尾有~字符的文件名表示臨時文件),這個命令可以這樣寫:
$ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
也可以這樣寫:
$ for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done
2、 while/do/done
?
while
的用法和C語言類似。比如一個驗證密碼的腳本:
#! /bin/sh echo "Enter password:" read TRY while [ "$TRY" != "secret" ]; do echo "Sorry, try again" read TRY done
下面的例子通過算術(shù)運算控制循環(huán)的次數(shù):
#! /bin/sh COUNTER=1 while [ "$COUNTER" -lt 10 ]; do echo "Here we go again" COUNTER=$(($COUNTER+1)) done
Shell還有until循環(huán),類似C語言的do...while循環(huán)。本章從略。
3、 位置參數(shù)和特殊變量
有很多特殊變量是被Shell自動賦值的,我們已經(jīng)遇到了
$?
和
$1
,現(xiàn)在總結(jié)一下:
?
位置參數(shù)可以用
shift
命令左移。比如
shift 3
表示原來的
$4
現(xiàn)在變成
$1
,原來的
$5
現(xiàn)在變成
$2
等等,原來的
$1
、
$2
、
$3
丟棄,
$0
不移動。不帶參數(shù)的
shift
命令相當(dāng)于
shift 1
。例如:
#! /bin/sh echo "The program $0 is now running" echo "The first parameter is $1" echo "The second parameter is $2" echo "The parameter list is $@" shift echo "The first parameter is $1" echo "The second parameter is $2" echo "The parameter list is $@"
4、函數(shù)
和C語言類似,Shell中也有函數(shù)的概念,但是函數(shù)定義中沒有返回值也沒有參數(shù)列表。例如:
#! /bin/sh foo(){ echo "Function foo is called";} echo "-=start=-" foo echo "-=end=-"
注意函數(shù)體的左花括號{和后面的命令之間必須有空格或換行,如果將最后一條命令和右花括號
}
寫在同一行,命令末尾必須有;號。
在定義
foo()
函數(shù)時并不執(zhí)行函數(shù)體中的命令,就像定義變量一樣,只是給
foo
這個名字一個定義,到后面調(diào)用
foo
函數(shù)的時候(注意Shell中的函數(shù)調(diào)用不寫括號)才執(zhí)行函數(shù)體中的命令。Shell腳本中的函數(shù)必須先定義后調(diào)用,一般把函數(shù)定義都寫在腳本的前面,把函數(shù)調(diào)用和其它命令寫在腳本的最后(類似C語言中的
main
函數(shù),這才是整個腳本實際開始執(zhí)行命令的地方)。
Shell函數(shù)沒有參數(shù)列表并不表示不能傳參數(shù),事實上,函數(shù)就像是迷你腳本,調(diào)用函數(shù)時可以傳任意個參數(shù),在函數(shù)內(nèi)同樣是用
$0
、
$1
、
$2
等變量來提取參數(shù),函數(shù)中的位置參數(shù)相當(dāng)于函數(shù)的局部變量,改變這些變量并不會影響函數(shù)外面的
$0
、
$1
、
$2
等變量。函數(shù)中可以用
return
命令返回,如果
return
后面跟一個數(shù)字則表示函數(shù)的Exit Status。
下面這個腳本可以一次創(chuàng)建多個目錄,各目錄名通過命令行參數(shù)傳入,腳本逐個測試各目錄是否存在,如果目錄不存在,首先打印信息然后試著創(chuàng)建該目錄。
#! /bin/sh is_directory() { DIR_NAME=$1 if [ ! -d $DIR_NAME ]; then return 1 else return 0 fi } for DIR in "$@"; do if is_directory "$DIR" then : else echo "$DIR doesn't exist. Creating it now..." mkdir $DIR > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Cannot create directory $DIR" exit 1 fi fi done
注意
is_directory()
返回0表示真返回1表示假。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
