shell程式設計入門指南

djbtestingsky發表於2009-08-19

shell程式設計入門指南

                                                  ---大頭針

一、變數

變數:C也是 從變數開始學起。shell程式設計也從變數學起。

變數三個方面:1、資料型別 2、生存期 3、作用域

 

1.1 資料型別:變數依據你賦值的型別

CShell對比:

C:

int a="abcd";(錯誤)

 

Shell:

a="abcdef"

a就是字串型別

b=3

b就是整型

 

1.2 變數

從變數的生存期和作用域角度劃分一般使用到得變數有三種。

1.本地變數

在使用者現在的shell生命期的指令碼中使用,如果shell啟動另一個程式或退出,此值失效。

5種常用的使用方法:

1.變數賦值

 a="abcd"

2.顯示變數

 echo $a

3.清除變數

 unset a

4.顯示所有本地shell

  set

5.只讀變數

  name="abc"; readonly name

 

2.環境變數

登入程式為父程式,shell中執行的使用者程式為子程式。環境變數可用於所有子程式。環境變數最好在profile檔案中定義。習慣上,所有環境變數均應該大寫。

5種常用的使用方法:

1.變數賦值

abc="abc";export abc

2.顯示環境變數

echo $abc

3.顯示所有環境變數

 env

4.清除環境變數

unset abc

5.常用環境變數

HOME PATH PWD  USER

 

3.位置變數

這個特別適合於執行命令時,傳遞引數。

1.位置變數一般用$0--$9

例如:

service httpd start

$0表示:service      

$1表示:httpd              

$2表示:start

2.$#表示引數的總個數

 

使用變數時注意事項:

在使用C程式設計的時候,在使用變數時,如果變數沒有被賦值就使用則會出現問題。Shell有專門的檢測變數是否被設定的方法:

測試變數是否已經設定

1.${var:-value}:

如果變數var未定義,返回一個預設值如果var存在且非空,則表示式${var:-value}的值為$var,如果var未定義,則表示式值${var:-value}value.

name1="dong";name2=${name1:-no name};echo $name1 $name2

unset name1; name2=${name1:-no name};echo $name1 $name2

2.${var:=value}:

如果var未定義,設定var的預設值為value

如果var存在且非空,則${var:=value}的值為$var;如果var為空或未定義,則var被賦值value且表示式值為value

3.${var:?mesg}

捕獲未定義變數導致的錯誤。

如果var存在且非空,則${var:?value}的值為$var;如果var為空或未定義,則列印mesg並終止指令碼。

4.${var:+mesg}:

測試一個變數的存在性

如果var存在且非空,則${var:+mesg}的返回值為mesg;如果var為空或未定義,則返回null

 

二、條件:

對於我們寫程式來說,無論選擇結構和迴圈結構都離不開條件。C語言的條件主要由運算子組成的各類表示式組成,條件的組成非常靈活。而shell的條件一般分為三類。其中的檔案狀態條件都是系統設定好的,只有記住才能夠利用好。

 

2.1.檔案狀態的條件

 1. file1 -ef file2  file1file2有相同的裝置和相同節點號。

 2. file1 -nt file2 file1file2修改時間更晚。

 3.file1 -ot file2 file1file2修改時間更早

 4. -b file1   file1存在並且是塊裝置

 5. -c file1   file1存在並且是字元裝置

 6. -d file1   file1存在並且是目錄

 7. -e file1   file1存在

 8. -f file1   file1存在並且是普通檔案

 9. -g file1   file1存在並且有組ID

 10. -h file1  file1存在並且是軟連結檔案

    -L file1

 11. -G file1  file1存在並且擁有者所在的組也存在

 12. -k file1  file1存在並且粘滯位已設定

 13. -O file1  file1存在並且擁有者也存在

 14. -p file1  file1存在並且是管道檔案

 15. -s file1  file1存在並且是非空檔案

 16. -S file1  file1存在並且是程式

 17. -t file1

 18. -u file1  file1存在並擁有者的ID位已設定。

 19. -w file1  file1存在並可寫

 20. -x file1  file1存在並可執行

 

2.2.字串的條件

  C語言中字串的比較是通過strcmp(str1,str2) 用函式實現字串比較

  Shell則比較簡單:

  1. -z string:字串為空串時返回真

  2. -n string:      不為空串

  3. str1 = str2   相等

  4. str1 != str2:   不相等時返回真

  5. str1<str2:

  6. str1>str2:                            

2.3.有關數值的條件

  C語言中數值比較,是通過算術運算子(> < =等)實現,而shell利用了一些單詞縮寫實現。

int1 -eq int2   等於

     -ne        不等於

     -lt        小於

     -le        小於等於

     -gt        大於

     -ge        大於等於

 

 

三、控制結構:

C的程式結構與Shell的程式結構大同小異。

3.1選擇結構:

1.If結構

if [ conditon1 ]

then

    statments1

elif [ condition2 ]

then

    statments2

else

    statments3

fi

 

2.case結構

 

case variable in

  value) command1

      exit 0

      ;;

  value) command 2

           exit 0

      ;;

esac

 

3.2.迴圈結構:

1.for結構

for name [in list]

do

  statements using $name

done

1.list應該是一系列由空格分隔的字元序列(單詞),省略in list 時預設為

 

$@(命令列的引數列表)

2.for迴圈執行的次數取決於列表list中單詞的個數

3.for迴圈體中一般要出現變數$name,但也可以不出現。

 

2.迴圈結構:until

until [ condition ]

do

  statments

done

 

condition 條件成立退出迴圈

 

 

3.迴圈結構:while迴圈

while [ condition ]

do

   statments

done

 

條件不成立退出迴圈

備註:

還有一些經常與迴圈結合的命令:比如break [n]continue  [n]。和Cbreak Continue功能基本一致。只不過break可以選擇跳出幾層迴圈、continue可以選擇跳過幾個回合。

四、命令

熟悉了上面三部分內容對於我們寫shell程式奠定了基礎。但巧婦難為無米之炊

 

shell程式的主體內容是shell所提供的命令:例如 cp ls useradd

如果你沒有系統學習過shell的命令,你是寫不出來shell程式的。

 

最後得出結論:

變數+條件+程式結構+shell命令==shell程式。

 

五、例項:

1. 編寫shell程式,實現自動增加50個賬號的功能。賬號名為stud1stud50

 

#! /bin/bash

#useradd.sh

 

#i這屬於 變數

i=1

 

#while 這屬於 程式結構

while [ $i -le 50 ]

do

  #cat ...命令的含義是使用管道以及正規表示式檢視passwd檔案中是否存在類似#stud1-stud50之間的使用者. 這屬於 shell 命令

 # -z 測試字串是否為空.這屬於 條件

       if [ -z "`cat /etc/passwd|grep "stud$i/>"`" ]

       then

              useradd stud$i

              echo "useradd success!"

       else

              "user stud$i exist!"

       fi

      

done

 

最終驗證了我的結論:

shell程式=變數+條件+程式結構+shell命令。

一開始接觸linux shell,大多都認為比較難學。但按照上面的學習思路,很快你就會學會shell程式設計。

 

六、補充知識:

函式:

Shell也提供了函式機制。格式如下:[function] NAME() {command-list;}

返回值:return [n]

將函式的返回值設定為n .若不指定n值,則使用return 之前所執行的最後一個命令的狀態值。

$?

執行後命令後的狀態

例項:

#/bin/bash

function psgrep

{

       ps –aux|grep $1

}

 

 

相關文章