bash腳本編程class3

bash腳本編程class3—函數定義與數組使用相關

    一.函數的使用以及數組的定義

  我們通過學習知道,當編輯一個shell腳本的時候,可以在這個shell腳本中調用其他的shell腳本來實現特定的功能。在實際工作環境中,用很多shell實現的功能是我們常常使用到的,如果一次一次的調用這些shell腳本會顯得非常麻煩。這時,函數的作用就體現出來了。其實函數就是一個被定義并命名的常用shell腳本,所有函數都集中放在一個配置文件中,當用戶使用的時候,只需要調用這個文件內容,就可以根據其中每個函數名稱來使用。比如如果我們在/etc/functions這個文件寫入了很多函數,如果想要在一個腳本中使用這些函數,只需要在腳本中調用/etc/functions這個文件,就可以使用這些函數了。

  

  1.函數的定義方式

  函數的定義方式有三種:

  function  函數名() { ;函數內容 ;}

  函數名 () { ;函數內容 ;}

  function 函數名 { ;函數內容 ;}

filejudge () {
[ ! -e $1 ]&&echo "meiwenjian"&& exit
if [[ -f $1 ]]
    then
    echo "This is a ordinary file"
elif [[ -d $1 ]]
    then
    echo "This is a directory"
elif [[ -h $1 ]]
    then
    echo "This is a link file"
else
    echo "This is an other file type"
fi
}

 上面使用的就是第二種函數命名方式,這個函數體實現的功能為辨別文件的類型。

  2.載入函數以及檢驗載入函數

  當我們在一個shell文件中編譯好了一系列的函數之后,如何使用這些函數呢?這里需要使用source或者.命令,這樣可以使函數文件的內容立即生效。使用set命令可以查看當前系統中定義的所有函數。如果想取消某些函數的使用,使用unset 函數名,就可以取消這個函數的使用。載入函數以后,直接使用函數名[后加參數],就可以實現函數功能了。

  3.函數的返回值以及局部變量

  在執行一個命令之后,echo $?可以顯示命令的成功與否。而函數大多是由多條命令組成的,正常情況下,當用戶鑒定函數體是否執行成功時,是根據函數中最后一條命令的成功與否來判斷的。如果想要定義返回值,使用return后接數字來實現。return 0表示成功,return1 1-255表示有錯誤返回值。同樣使用echo命令來顯示。return的好處是可以根據返回狀態值進行條件選擇執行不同分支的命令,從而使函數應用性更強。

  在函數中可以定義變量,可以定義本地變量與環境變量。但是如果用戶只想要在函數中使用這個變量,執行函數完成后不想讓這個變量在當前shell中繼續使用,防止與同名變量沖突。這該怎么辦呢?Linux的有一種變量可以達到這個卸磨殺驢的效果,就是局部變量,這個變量只能在函數中定義,只能在函數體中使用,執行完函數體就沒效果了。使用local name=變量名,來定義。比如:

#!/bin/bash
name=dafei
xxx () {
   local name=xiaowangba
}
echo $name

 上述我們寫一個函數的腳本,先定義變量name=dafei,然后在函數體內定義局部變量name=xiaowangba,在函數外執行name變量顯示。如果執行這個腳本,你猜name會是什么?

[root@localhost bin]# bash funstest.sh
dafei

 當然是dafei。

  4.函數遞歸以及其使用實例

  函數遞歸說白了就是函數自己調用自己,前提是此函數可以使用的情況下。應用這種遞歸方式,可以實現一些規律性的數據計算。比如 Fn = Fn-1 + Fn-2。如果想計算Fn的值,需要如下函數遞歸:

goldrabbit () {
  if [ $1 -eq 1 ];then
     echo 0
  elif [ $1 -eq 2 -o $1 -eq 3 ];then
     echo 1
  else
     echo $[$(goldrabbit $[$1-1])+$(goldrabbit $[$1-2])]
  fi
}

 goldrabbit為函數名,根據數列規律我們得知:F3=F2+F1=1,F2=F3=1,F1=0。F4=F2+F3=2…這樣就可以得知Fn的值了。

    二.數組定義以及字符串處理

  

  1.數組的定義

  之前所學的變量每一次賦值都是單個數字或者字符串,如果想要一次賦值多個變量,就需要數組的概念了。使用name=(若干變量…)。定義name為一個數組。

  使用數組之前一般需要declare -a name聲明數組。變量分割符為空格,默認從name[0]到name[n-1]。比如:

[root@localhost ~]# baobao=(xx yy zz aa bb)
[root@localhost ~]# echo ${baobao[1]}
yy

 如上這里為變量baobao定義一個數組,顯示baobao[1],結果為數組中的第二個變量yy。

 有些時候數組的排序不適用0到n-1,使用a,b,c..也是可以的,但是前面一定要聲明declare -A。比如:

[root@localhost ~]# declare -A baobao
[root@localhost ~]# baobao=([a]=aa [b]=bb [c]=cc [d]=dd)
[root@localhost ~]# echo ${baobao[b]}
bb

 這里可以看到數組變量的排序不是0到n-1了,而是a,b,c,d。這就是關聯數組declare -A的作用。

  2.數組變量的修改

  實現數組內容的增刪查改:只能追增,根據編號順序追增,如果編號順序重復則覆蓋。刪,使用unset name[number]刪除編號的內容。查,echo ${name[*]}顯示所有變量,echo ${#name[*]}顯示數組中變量個數。上例子:

[root@localhost ~]# declare -a baobao
[root@localhost ~]# baobao=(aa bb cc dd ee)
[root@localhost ~]# echo ${#baobao[*]}
5
[root@localhost ~]# echo ${baobao[*]}
aa bb cc dd ee
[root@localhost ~]# baobao[6]=xx
[root@localhost ~]# echo ${baobao[*]}
aa bb cc dd ee xx
[root@localhost ~]# unset baobao[0]
[root@localhost ~]# echo ${baobao[*]}
bb cc dd ee xx

 增刪查改baobao。

  也可以使用${baobao[*]:1:3}表示去掉前一個(按編號),然后接著取3個(按編號)baobao數組的變量:

echo ${baobao[*]:1:3}
bb cc dd

  由于baobao[0]被刪除了,所以越過baobao[0]取接下來的baobao[1],baobao[2],baobao[3],于是得到bb cc dd

例題:使用冒泡排序法找出10個隨機數的最大值

[root@localhost bin]# cat funstest.sh
#!/bin/bash
for i in `seq 0 9`;do
    ran[$i]=$RANDOM
    if [ $i -eq 0 ];then
       max=${ran[$i]}
    elif [ ${ran[$i]} -gt ${ran[$[$i-1]]} ];then
       max=${ran[$i]}
    fi
done
echo ${ran[@]}
echo "max: $max"
    

[root@localhost bin]# bash funstest.sh
3232 5655 22990 30240 28066 15611 11885 7793 15777 13386
max: 15777

  使用數組,非常簡單。

  3.字符串處理

  這里指的字符串處理是bash自帶功能的字符串處理,而不是通過cut命令之類的,同時字符串一般是由一個變量代表的。比如:

[root@localhost ~]# baobao=aaadfjaojsfpajfiqfkangiuowang
[root@localhost ~]# echo ${baobao:3}
dfjaojsfpajfiqfkangiuowang
[root@localhost ~]# echo ${baobao:3:2}
df

  上述命令,第一個表示取baobao去掉前三個字符的字符串內容,后一個表示去掉前三個接著只取后續的兩個字符。

[root@localhost bin]# echo $baobao 
aaadfjaojsfpajfiqfkangiuowang
[root@localhost bin]# echo ${baobao#*js}
fpajfiqfkangiuowang
[root@localhost bin]# echo ${baobao%js*}
aaadfjao

  上述命令#,%分別代表選取字符串的特定內容,#表示從左向右找到js以及js右側的內容,%表示從右向左找到js以及js左側的內容,這里#,%后面的word表示第一次找到的word,如果換成##,%%就會變成最后一次找到的word

[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp
[root@localhost bin]# echo ${baobao##*baba}
kjrgjwp
[root@localhost bin]# echo ${baobao%%*baba}
dadsbabagwegwjkhwoibabakjrgjwp

 如上所述。

  最后介紹轉換字符串大小寫的方法:

[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp
[root@localhost bin]# echo ${baobao^^} 
DADSBABAGWEGWJKHWOIBABAKJRGJWP

[root@localhost bin]# xx=`echo ${baobao^^}`
[root@localhost bin]# echo $xx
DADSBABAGWEGWJKHWOIBABAKJRGJWP
[root@localhost bin]# echo ${xx,,}
dadsbabagwegwjkhwoibabakjrgjwp

  懂沒?不懂再學。

原創文章,作者:mcgeewang,如若轉載,請注明出處:http://www.www58058.com/39242

(0)
mcgeewangmcgeewang
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 8.5文本處理工具及正則表達式

    一、各種文本工具     文件查看     命令:cat,tac,rev         cat optiong file       &n…

    Linux干貨 2016-08-10
  • Code Review中的幾個提示

    Code Review應該是軟件工程最最有價值的一個活動,之前,本站發表過《簡單實用的Code Review工具》,那些工具主要是用來幫助更有效地進行這個活動,這里的這篇文章,我們主要想和大家分享一下Code Review代碼審查的一些心得。 首先,我們先來看看Code Reivew的用處: Code reviews 中,可以通過大家的建議增進代碼的質量。 …

    Linux干貨 2015-04-03
  • Linux 性能監控、測試、優化工具

    Linux 平臺上的性能工具有很多,眼花繚亂,長期的摸索和經驗發現最好用的還是那些久經考驗的、簡單的小工具。系統性能專家 BrendanD. Gregg 在最近的 LinuxCon NA 2014 大會上更新了他那個有名的關于 Linux 性能方面的 talk (Linux Performance Tools) 和幻燈片。    和 Br…

    Linux干貨 2015-03-03
  • 第九周練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # nologin=$(awk -F: '$NF=="/sbin/nologin"{print $NF}…

    Linux干貨 2016-12-21
  • shell腳本編程入門(一)

    概述 shell腳本就像是早期DOS年代的批處理文件(.bat),最簡單的功能就是將許多命令寫在一起,讓用戶很輕松能夠一下子處理復雜的操作(執行一個腳本就能夠一次執行多個命令)。而shell腳本更提供數組、循環、條件與邏輯判斷等功能,讓用戶也可以直接以shell來編寫程序,而不必使用類似C語言等傳統程序編寫的語法。 shell腳本基礎 shell腳本是包含一…

    Linux干貨 2016-08-15
  • pam_mysql認證ftp虛擬用戶賬號,且擁有不同的權限

    關防火墻:#systemctl stop firewalld                #setenforce 0 #yum install mariadb.server #yum install mariadb-d…

    Linux干貨 2017-06-07

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-25 13:29

    文章整體思路清晰,shell腳本函數和數組定義理解透徹,看完博客給人一中概覽性的認識,整篇博客讓人能看到很多專業性所在,還能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!

欧美性久久久久