Shell編程–分述

來源:互聯網
上載者:User

一、Shell變數 主要有本地變數和環境變數。

        1、本地變數   -- 在使用者現有啟動並執行指令碼中使用
              1) 定義本地變數     格式: variable-name=value
                   例子:[root@jike1 /root]# LOCALTEST="test"
                            [root@jike1 /root]# echo $LOCALTEST            (注意:echo $LOCALTEST 和 echo ${LOCALTEST}的效果是一樣的)
                  (在變數名前加$, 可以取得此變數的值,使用echo命令可以顯示變數的值)
               2) 顯示本地變數     格式: set
                   例子:[root@chinaitlab root]# set
              3) 清除本地變數     格式:unset variable-name
                   例如:[root@jike1 /root]# unset LOCALTEST
                   此時再執行echo $LOCALTEST將看不到變數LOCALTEST的輸出。
                           
        2、環境變數 -- 在所有的子進程中使用
              1) 定義環境變數     格式: export variable-name=value (與本地變數的定義相比,多了一個export關鍵字)
                   例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
                               [root@ chinaitlab shell]# vi testenv.sh
                                #!/bin/bash                        #表示用bash來解析指令碼
                                #testenv.sh
                                echo $DOMAIN
                              [root@chinaitlab shell]# chmod +x testenv.sh
                               [root@chinaitlab shell]# ./testenv.sh
                                 chinaitlab.com
                 2) 顯示環境變數     格式: env      (本地變數的顯示使用set,環境變數的顯示使用env)
                     例子: [root@chinaitlab test]# env
                 3) 清除環境變數     格式:unset variable-name      (用法與本地變數相同,都使用unset)
                    例子: [root@chinaitlab shell]# unset DOMAIN
                     此時再執行./testenv.sh將看不到變數DOMAIN的輸出。   

         3、其它變數
               1) 位置變數      $0,$1,$2,$3……$9
               2) 唯讀變數 readonly variable
                  注意:唯讀變數不能被清除和改變其值,所以要謹慎使用。
               3) 特殊變數      $#,$?,$$(表示當前進程的PID)……

二、運算子和運算式
        
         1、運算子是對電腦發的指令,運算子類型有:
                 算術運算子(+、-、*、/)
                 按位元運算符(~、<<、>>、&、|、^)
                 邏輯運算子(&&、||、 > 、= = 、<、! =)
                 賦值運算子(=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=)
        
         2、運算式是運算子和運算對象的組合體。
                 1) $[]:可以接受不同基數的數位運算式
                     echo $[10+1]                             (輸出:11)
                     echo "$[2+3],$HOME"             (輸出:5,/root)
                     echo $[2<<3],$[8>>1]             (輸出:16,4)    
                     echo $[2>3],$[3>2]                 (輸出:0,1 運算式為false時輸出0,為true時輸出1)
                 2) 字元運算式:直接書寫,採用單引號,雙引號引起來。
                     echo " $HOME,That is your root directory."      (輸出:/root,That is your root directory.)
                     echo ' $HOME,That is your root directory. '      (輸出:$HOME,That is your root directory.)
                    單引號和雙引號的區別在於:單引號是原樣顯示,雙引號則顯示出變數的值。
                 3) test運算式

三、控制結構

         1、if語句
               例:   #!/bin/bash
                       #if.sh
                       if [ "10" -lt "12" ]            #注意:if和[之間,[和"10"之間,"12"和]都有空格,如果不加空格,會出現語法錯誤
                       then
                       echo "Yes,10 is less than 12"
                       fi

         2、case語句
              例: #!/bin/bash
                      #case.sh
                       echo -n "Enter a start or stop:"
                       read ANS
                       case $ANS in
                       start)
                            echo "You select start"
                            ;;
                       stop)
                            echo "You select stop"
                            ;;
                       *)
                            echo "`basename $0`: You select is not between start and stop" >&2            
                           #注意:>和&2之間沒有空格,>&2 表示將顯示輸出到標準輸出(一般是螢幕)上
                            exit;
                            ;;
                       esac

         3、for迴圈語句
              格式:   for 變數名 in 列表
                          do
                               命令1
                               命令2
                               ... ...
                          done

         4、until迴圈語句
              格式:   until 條件
                          do
                               命令1
                               命令2
                               ... ...
                          done

         5、while迴圈語句
              格式:    while 命令
                           do
                               命令1
                           break
                               命令2
                           continue
                               命令3
                               ... ...
                           done

四、輸入輸出

         1、幾個重要的工具
              1) echo
                   例:echo -n "Enter a number from 1 to 2:"     (-n 表示不換行,此時游標停留在行尾)
              2) read
                  例:read ANS      (表示將使用者的輸入存放到變數ANS中)
              3) cat     (顯示檔案內容)
              4) 管道( | )     (一個程式的輸出作為另一個程式的輸入)
                  例:ls -l | grep "d"
              5) 檔案重新導向( >和>> )
                  例:ls -l > /tmp/a.txt     (將輸出的結果重寫到a.txt這個檔案中)
                         ls -l >> /tmp/a.txt    (將輸出的結果追加到a.txt這個檔案中,常用於記錄日誌)
              6) 標準輸入( $0 )、標準輸出( $1 )和標準錯誤( $2 )
                   採用檔案描述符($0、$1、$2)來定義。

         2、執行個體:readme.sh
                 #!/bin/bash
                 #readname.sh
                 echo -n "First Name: "
                 read firstname
                 echo -n "Last Name: "
                 read lastname subname
                 echo -e "Your First Name is :${firstname}\n "             #加了-e表示將\n解析為逸出字元
                 echo -e "Your Last Name is :${lastname}\n "
                 echo -e "Your Subname is :${subname}\n "
                 echo "Your First Name is :${firstname}\n " >>firstname.txt        #這行沒加-e,因此在輸出中會原樣顯示\n
                 echo "Your Last Name is :${lastname}\n " >lastname.txt
                 echo "Your Subname is :${subname}\n " >&1

五、文本過濾

         1、Regex     (就是模式比對)
         2、find     (尋找檔案)
              例:find ./ -name "*.txt" -print
         3、grep     (尋找字元)
              例:grep "[5-8][6-9][0-3]" access_log
         4、awk     (把一系列資料分域,即分成列)
               例:awk '{print $1"\t"$4}' access_log
         5、sed     (對資料進行尋找和替換)
              例:sed -n 's/chinaitlab/hello/p' myfile.txt     (將myfile.txt檔案中的chinaitlab替換成hello,並列印到螢幕上來,s表示替換,p表示列印。如果 加上重新導向符就可以將替換後的內容輸出到一個檔案中去。)
         6、sort     (排序)
              例:sort ip.txt
         7、uniq     (顯示這一列是唯一的還是不唯一的,可以唯一化)
              例:uniq ip.txt
         8、split     (可以對檔案進行分割)
               例:split myfile.txt
         9、執行個體:kill_process.sh
                 #!/bin/bash
                 #kill_process.sh
                 current_PID=$$
                 ps -aux|grep "/usr/sbin/sshd"|grep -v "grep"|awk '{print $2}'>/tmp/${current_PID}.txt
                 for pid in `cat /tmp/${current_PID}.txt`
                 do
                 {
                      echo "kill -9 $pid"
                      kill -9 $pid
                 }
                 done
                 rm -f /tmp/${current_PID}.txt

六、Shell函數

        1、定義函數有兩種格式,分別為:
                 函數名()
                 {
                      命令1
                      ... ...
                 }
                 function 函數名()
                 {
                      ... ...
                 }

         2、執行個體:func.sh
                 #!/bin/bash
                 #func.sh
                 # Source function library.            # /etc/rc.d/init.d/functions中存放了大量已經寫好的函數
                 . /etc/rc.d/init.d/functions            # 引入/etc/rc.d/init.d/functions中的函數,相當於其它語言中的include
                 function hello ()
                 {  
                 echo "Hello,$1 today is `date`"
                 }
                 echo "now going to the function hello"
                 hello chinaitlab
                 echo "back from the function"

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.