BASH 編程

一個最經典的Hello World程序 
          #!/bin/bash          
          echo Hello World    
        
這 個腳本只有二行,它的第一行這個腳本程序由那個程序來解釋.第二行只有一個簡單的動做,它的功能是在終端上打印出一行」Hello World」 。若是 你測試着執行這個命令時(./hello.sh),你將會獲得一個command not found的信息,這種狀況大部分多是你的第一行#! /bin/bash這個程序有問題,你必定要確保bash能夠找到而且可用。(通常狀況下你還要對這個腳本附一個可執行權限)
#chmod u+x hello.sh
一個很是簡單的備份腳本
        #!/bin/bash          
        tar -cZf /var/my-backup.tgz /home/me/
        
在這個腳本中,它替換了上一個例子的將一行信息打印在終端上的功能,取爾代之的是一個備份/home目錄的tar備份命令。
關於重定向的一些信息
最基本的理論基礎
這裏有對於三個文件的重定向定義: stdin(標準輸入), stdout(標準輸出) and stderr(標準錯誤輸出) (std=standard). 
基本上你能夠
1. 重定向 stdout 到一個文件
2. 重定向 stderr 到一個文件
3. 重定向 stdout 到stderr 
4. 重定向 stderr 到 stdout 
5. 重定向 stderr 到 stdout 中而且成爲一個文件 
6. 重定向 stderr and stdout to stdout 
7. 重定向 stderr and stdout to stderr 
在Linux中 1表明 '標準輸出', 2表明’標準錯誤’
標準輸出
這個例子將會使ls的顯示結果重定向到一個文件中.
        ls -l > ls-l.txt
        
標準錯誤
這個例子將會使grep命令在運行過程當中出現的錯誤輸出到一個文件中 
        grep da * 2> grep-errors.txt
        
管道
這一節咱們將解釋一個很是簡單的而且你之後必定會用到的功能,它就是管道。 
爲何你們都會用到管道?
管道可使你很是方便的將一個程序的結果轉向到另一個程序中。 
一個sed的例子
這個例子使用了很是簡單的管道功能:
        ls -l | sed -e "s/[aeio]/u/g"   
        
當咱們執行如下命令後:首先ls –l會先執行而且它會輸出結果信息可是若是它的後面跟是一個管道符的話,那麼它就會將結果從新定向到sed這個程序中,sed使用了替換功能,因此這個例子執行完會,會將ls –l結果中全部含有aeio的英文單詞替換成單詞u. 
經過另外的方法實現ls –l *.txt
也許這種方法不一樣於ls –l *.txt,可是它避免了出現一條 No Such file Or Directory這種信息。 
        ls -l | grep ".txt"
        
當ls –l 執行後,它會將程序結果輸出到grep這個程序中,而且去匹配.txt這條信息。
變量
你可在任何編程語言中使用變量,可是在腳本編程中它們是沒有類型的,簡稱弱類型編程語言,在這個變量中能夠保含一個數字,一個字符串,一個單詞等。你並不須要聲明這個變量,它會在引用這個變量時建立它。 
使用變量來實現一個簡單的Hello World
            #!/bin/bash          
            STR="Hello World!"
            echo $STR    
            
第二行創建一個STR的變量而且爲其附了一個「Hello World」的字符串變量值。當在這個變量前面加上一個$符號時,咱們就將會獲得這個變量的值。 
例子(一個使用變量的備份腳本) 
           #!/bin/bash          
           OF=/var/my-backup-$(date +%Y%m%d).tgz
           tar -cZf $OF /home/me/
           
局部變量
局部變量的生命是有限的,請看下面的例子
                #!/bin/bash
                HELLO=Hello 
                function hello {
                        local HELLO=World
                        echo $HELLO
                }
                echo $HELLO
                hello
                echo $HELLO
        
條件語句
條件語句可使你決定是完成一個運做或是不去完成一個動做時,經過一些判斷來實現,通常狀況都是經過一些操做符來實現判斷。 
條件語句能夠有許多實現方法,最多的狀況是基於if expression then 這種狀況,也就是你們經常說的if判斷語句。它的語法基本結構以下:
if [expression]; 
then 
code if 'expression' is true. 
fi 
一個最基本的使用if ...then的例子 
            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo expression evaluated as true
            fi
            
這段代碼執行if判斷,若是foo等於foo的話,那麼你就會執行then語句下的輸出語句,最後經過fi來結束,這裏我要強調一點,就是不少新手在輸入源碼時特別是在if 語句後面沒有空格,在大括號後面沒有空格,在等號兩邊沒有空格,這些都會製造出一些麻煩的。 
一個簡單的控制if .. then ...else 
            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo expression evaluated as true
            else
               echo expression evaluated as false
            fi
            
6.4 經過變量進行判斷控制
            #!/bin/bash
            T1="foo"
            T2="bar"
            if [ "$T1" = "$T2" ]; then
                echo expression evaluated as true
            else
                echo expression evaluated as false
            fi
            
7. 循環結構
在這一節中,你將會學習for、while、until loops循環
對於for 循環它有一點不一樣於其餘的編程語言,它有一點像VB中的for each語句,就是所謂的遞歸的循環。
對於while循環,它實際上是一個增強的if語句,若是它的條件爲真,那麼它就一直執行while循環中的語句中的內容。
7.1 For sample 
        #!/bin/bash
        for i in $( ls  ; do
            echo item: $i
        done
        
在第二行上,咱們聲明瞭一個i的變量,它將一直將ls命令的結果所有循環出來。其中do 和done之間是所要執行的代碼。 
While循環例子
         #!/bin/bash 
         COUNTER=0
         while [  $COUNTER -lt 10 ]; do
             echo The counter is $COUNTER
             let COUNTER=COUNTER+1 
         done
         這裏面你們可能看到一個-lt的命令選項,這裏它表明小於等於
-eq 等於
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於
Until的例子
         #!/bin/bash 
         COUNTER=20
         until [  $COUNTER -lt 10 ]; do
             echo COUNTER $COUNTER
             let COUNTER-=1
         done
         
函數
對於大多數編程語言,你均可以調用函數來執行一段代碼,這樣可使用減小重複的書寫代碼。 
函數的例子
           #!/bin/bash 
           function quit {
               exit
           }
           function hello {
               echo Hello!
           }
           hello
           quit
           echo foo 
           
在 2-4行包含了一個quit函數,在5-7行包含了 hello函數,若是你不是很肯定這個腳本是是什麼意思,那麼我建議試試它。 Notice that a functions don't need to be declared in any specific order. 
當你運行這個腳本時你的程序將會最早調用hello函數,之後再調用quit函數最後才執行echo 輸出命令。 
在函數中使用參數
                #!/bin/bash 
                function quit {
                   exit
                }  
                function e {
                    echo $1 
                }  
                e Hello
                e World
                quit
                echo foo 

           
這個腳本幾乎和前一個腳本沒有什麼不能,但最主要的不一樣是e這個函數可使用參數了。 
用戶接口
使用select命令製做簡單的菜單
           #!/bin/bash
           OPTIONS="Hello Quit"
           select opt in $OPTIONS; do
               if [ "$opt" = "Quit" ]; then
                echo done
                exit
               elif [ "$opt" = "Hello" ]; then
                echo Hello World
               else
                clear
                echo bad option
               fi
           done
          
若是你運行這個腳本你將會看到一個很是簡單的菜單 
使用read讀入用戶輸入
在多數狀況下你可能會用到提示請進行輸入這種狀態而且有幾種方法能夠用。這是其中的一種方法: 
                #!/bin/bash
                echo Please, enter your name
                read NAME
                echo "Hi $NAME!"
        
對於變量來講,你能夠經過多個值來讀入。 
                #!/bin/bash
                echo Please, enter your firstname and lastname
                read FN LN 
                echo "Hi! $LN, $FN !"
        
算術操做
使用如下的命令:
 echo 1 + 1 
若是你但願看到2,那麼你會很失望,那麼咱們應該如何進行操做哪? echo $((1+1)) 
咱們可使用如下方法:
echo $[1+1] 
        
算術操做




% (remainder) 
關係操做
-lt (<  
-gt (>   -le (<=)  -ge (>=)  -eq (==)  -ne (!=)
相關文章
相關標籤/搜索