£select
select循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示PS3提示符,等待用戶的輸入,用戶輸入菜單列表中的某個數字,執行相應的命令,用戶輸入被保存在變量REPLY中。
select是個無限循環,因此要記住用break命令退出循環,或者用exit直接退出腳本,也可以使用ctrl+c退出循環
select語句結構:
select 變量 in 選項1 選項2 ;do
break
done
#!/bin/sh
PS3="what is you favourite OS?:"
select i in "Linux" "Windows" "Mac";do
echo "you have select $REPLY"
break
done
£select和if選擇語句的使用
#!/bin/bash
#
PS3="please input a color:"
select color in red white black ; do
if [[ "$color" == "red" ]];then
echo " is good"
elif [[ "$color" == "white" ]] ;then
echo "is ok "
elif [[ "$color" == "black" ]];then
echo "is god"
fi
break
done
£select和case
#!/bin/bash
#
PS3="please input a color:"
select color in “red” “white” “black” ; do
case $color in
red)
echo “is goog”
;;
white)
echo “is ok”
;;
black)
echo “is god”
;;
*)
exit
esac
done
break
done
£函數
函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程,最大化的代碼重用和最小化的代碼冗余,它與shell程序形式上是相似的,不同的是他不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。函數是
函數和shell程序的差異
shell程序在子shell中運行,而shell函數在當前shell中運行,因此在當前shell中,函數可以shell中變量進行修改
函數由兩部分組成:函數名和函數體
語法一:
function f_name {
函數體
}
語法二:
function f_name () {
函數體
}
語法三:
f_name (){
函數體
}
函數有兩種返回值:
函數的執行結果返回值:
(1) 使用echo或printf命令進行輸出
(2) 函數體中調用命令的輸出結果
函數的退出碼狀態:
(1) 取決于函數中執行的最后一條命令的退出狀態碼
(2) 自定義退出狀態碼,其格式為:
return 從函數中返回,用最后狀態命令決定返回值
return 0 無錯誤返回
return 1-255 有錯誤返回
函數使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它后才能使用
調用時直接使用函數名即可,如下例子
利用函數來顯示當前系統的主機名
利用函數顯示用的uid及shell類型
有時候我們會經常進行某些操作,每次重新寫一遍太耗時,有了函數我們就可將要執行的操作定義在函數中,這樣在我們想執行某些操作的時候,直接來調用函數來完成操作,如果是多個函數,那么可以定義在一個文件當中,然后將函數載入shell,文件名可任意取,但最好跟某些任務有某種關聯,這樣用的時候也好找一些。
一旦函數文件載入shell,就可以在命令或腳本中調用函數??梢允褂?/span>set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數
若要改動函數,首先用unst命令從shell中刪除函數,改動完畢后,再重新載入此文件
載入函數的方法
. filename 或source filename兩者的區別是前者里定義的變量不會加載到環境變量中,而后者恰恰相反
刪除函數的方法
使用unset function_name跟刪除變量一樣
£函數參數
傳遞參數給函數:調用函數時,在函數名后面以空白分隔給定參數列表即可;例如“testfunc arg1 arg2 …”
在函數體中當中,可使用$1, $2, …調用這些參數;還可以使用$@, $*, $#等特殊變量,注意:如果函數中有局部變量,如果其名稱同本地變量,使用局部變量
1、斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)
寫一個函數,求n階斐波那契數列
#!/bin/bash
#
fab() {
if [ $1 -eq 1 ] ;then
echo -n "1 "
elif [ $1 -eq 1 ] ;then
echo -n "1 "
else
echo -n "$[$(fab $[$1-1]) + $(fab $[$1-2] ) ] "
fi
}
for i in {1..10};do
fab $i
echo
done
2、漢諾塔(又稱河內塔)問題是源于印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
利用函數,實現N片盤的漢諾塔的移動步驟
#!/bin/bash
#
step=0
move (){
let step++
echo "$step: move disk $1 $2 —–> $3"
}
hanoi(){
if [ $1 -eq 1 ];then
move $1 $2 $4
else
hanoi "$[$1-1]" $2 $4 $3
move $1 $2 $4
hanoi "$[$1-1]" $3 $2 $4
fi
}
read -p "please input the number of plates: " number
hanoi $number A B C
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/38082