bash腳本編程學習筆記(一)


  bash腳本語言,不同於C/C++是一種解釋性語言。即在執行前不需要事先轉變為可執行的二進制代碼,而是每次執行時經解釋器解釋后執行。bash腳本語言是命令的堆砌,即按照實際需要,結合命令流程機制實現的源程序,因此他學習起來要比C/C++簡單的多。

  1.bash中的變量

    bash中的變量分為本地變量,局部變量和環境變量等

      本地變量:使用格式為varname=值,本地變量的聲明周期為整個腳本進程

      局部變量:使用格式為local varname=值,局部變量的聲明周期為整個腳本進程

      環境變量:使用格式為export varname=值,作用域為當前shell進程及子進程。命令腳本在執行時,會啟動shell的子進程,命令行中啟動的腳本會繼承當前的shell環境變量,系統自動執行腳本(非命令行啟動)就需要自我定義環境變量

      位置變量:$1,$2...表示引用的參數

          shift:踢出參數  shift n:表示踢出n個參數

      特殊變量:$?保存了上一個命令執行的狀態返回值(程序執行可能有兩類返回值,一種是執行的狀態返回值,一種是執行命令的返回值)

          程序狀態返回代碼:(0-255)

          0:表示執行正確

          1-255:都是錯誤的

    

    撤銷變量:uset 變量名稱

    查看當前shell中的變量:set命令

    查看當前shell中的環境變量:printenv,env,export

    在原來的值后面補加一個值:

      ANIMALS=pig

      ANIMALS=$ANIMALS:gost

      執行結果:pig:gost

    注意:變量名稱只能包含字母、數字和下划線,並且不能以數字開頭,不應該跟系統中已有的環境變量重名,最好做到見名知意。

    2.bash中的條件判斷

      條件測試類型:

        整數測試,字符測試,文件測試

      條件測試的表達式:

        [ express ]:注意括號兩側有空格,括號中的表達式是關鍵字

        [[express]

      怎么寫一個條件表達式:

        整數比較:

          -eq:測試兩個整數是否相等,$A -eq $B

          -ne:測試兩個整數是否不等,不等為真,相等為假

          -gt:測試一個數是否大於一個數,大於為真,小於為假

          -lt:測試一個數是否小於一個數,小於為真,大於為假

          -ge:大於或等於

          -le:小於或等於

        文件測試:

          -e 文件名/文件路徑 測試文件是否存在

          -f 文件名/文件路徑 測試文件是否為普通文件

          -d 文件名/文件路徑 測試文件是否是目錄

          -r 文件名/文件路徑  測試文件是否是可讀的

          -w 文件名/文件路徑 測試文件是否是可寫的

          -x 文件名/文件路徑 測試當前用戶是否可讀可寫可執行

    練習:給定一個文件,如果是一個普通文件,就顯示之;如果是一個目錄也顯示之,否則就顯示無法識別這個文件。
    #!/bin/bash
    FILE=/etc/inittab
    if [ ! -e $FILE ];then
    echo "No such file."
    exit 6
    elif [ -f $FILE ];then
    echo "common file"
    elif[ -d $FILE ];then
    echo "directory"
    else
    "unknown"
    fi

    3.命令件的邏輯關系

      邏輯與:&&

        第一個條件為假時,第二個條件不用再判斷,最終結果已經有;

        第一個條件為真,第二個條件必須得判斷

      邏輯或:||

        只要有一個條件為真即可

      eg:

        user1存在就輸出hello student

          id user1 &> /dev/null&&echo "hello student" 

        如果user6不存在,就添加用戶user6

          !id user6&&useradd user6

          id user6||useradd user6

        如果用戶存在,就顯示此用戶否則就添加此用戶

          id user1&&useradd user1||echo "user1 exits"

        如果用戶不存在,就添加,否則顯示已存在

           !id user1&&useradd user1||echo "user1 exits"  

        如果用戶不存在,添加並且給密碼;否則顯示其已經存在

          !id user1&&useradd&&echo "user1"|passwd --stdin user1||echo "user1 exits"  //使用管道給user1添加密碼

    4.在shell中進行運算

      1.使用let命令做運算:let C=$A+$B

      2.$[算數運算表達式]:C=$[$A+$B]

      3.$((運算表達式)):C=$(($A+$B))

      4.expr算數運算表達式,表達式中各操作及運算符之間要有空格,而且要使用反引號將命令引用

        C=`expr $A+$B`

    5.條件判斷控制結構    

    單分支的if語句:
      if 判斷條件; then
      statement1
      statement2
      fi
 
    雙分支的if語句:
      if 判斷條件; then
      statement1
      statement2
      else
      statement3
      statement4
      fi
 
    多分支的if語句
      if 判斷條件;then
      statement1
      ...
      elif 判斷條件;then
      statement2
      ...
      elif 判斷條件;then
      statement3
      ...
      else
      statement4
      ...
      fi
    
    練習:如果用戶已存在,則顯示存在,如果不存在添加用戶
      if id $NAME &> /dev/null;then //&> /dev/null 表示不顯示輸出信息,&> 為重定向
      echo "$NAME exits"
      else
      useradd $NAME
      echo $NAME|passwd --stdin $NAME &> /dev/null //為用戶設定密碼
      echo "Add $NAME finish"
      fi
 
    練習:寫一個腳本
      給定一個文件,比如/etc/inittab,判斷這個文件中是否有空白行;如果有,則顯示其空白行數;否則顯示沒有空白行
      #!/bin/bash
      $FILE=/etc/inittab
      if grep "^$" &> /dev/null;then //使用正則表達式來判斷是否有空白行
        echo "total blank lines `grep "^$" $FILE|wc -l`" //使用管道計算
      else
        echo "No blank lines"
      fi
 

      練習:寫一個腳本

        判斷當前系統上是否有用戶默認shell為bash,如果有,就顯示其中的一個用戶名,否則就顯示沒有這類用戶

          #!/bin/bash

          grep "/<bash$" /etc/passwd &>/dev/null

          RETVAL=$?    //上一條命令的執行狀態碼,為0表示執行成功,否則失敗

          if [ $RETVAL -eq 0 ];then

            AUSERS=`grep "\<bash$" /etc/passwd|head -1|cut -d: -f1`  //顯示用戶名

            echo "$AUSERS is one of such user"

          else

            echo "no such user"

          fi

    

    6.選擇結構case語句
    case SWITCH in
    value1)
    statement
    ...
    ;; //以雙分號結尾
    value2)
    statement
    ...
    ;;
    *)
    statement
    ...
    ;;
   esac
 
練習:寫一個腳本
傳遞一個參數,判斷這個參數是數字還是字母還是特殊字符
#!/bin/bash
case $1 in
[ 0-9 ])
echo "Adigit";;
[ a-z ])
echo "Lower";;
[ A-Z ])
echo "Upper";;
*)
echo "Special charactor";;
esca
 
  練習:寫一個腳本
  只接受參數start,stop,restart,status其中之一,如果傳入的不是這四個參數則提示
    #!/bin/bash
    case $1 in
    'start')
    echo "start";;
    'stop')
    echo "stop";;
    'restart')
    echo "restart";;
    'status')
    echo "status";;
    *)
    //echo "please input start or stop or restart or status"
    echo "`basename $0` {start|stop|restart|status}";;
    esac
    7.bash腳本的結構
      順序結構
      選擇結構
        if
        case
      循環結構
        for
        while
        until
 
for循環:
for 變量 in 列表;do //形式1
statement
done
 
for ((expr1;expr2;expr3));do //形式2,近似於C語言
list
done
 
練習:計算1-100以內正整數的和;
#!/bin/bash
declare -i SUM=0
for I in [1-100];do
let SUM+=$I
done
echo $SUM
 
#!/bin/bash
declare -i SUM=0
for ((I=1;I<=100;I++));do
let SUM+=$I;
done
echo $SUM
while循環:
  while CONDTION;do
  statement
  done
進入循環,條件滿足
退出條件,條件不滿足
 
until循環: //形式跟while一樣,但是進入退出循環條件剛好相反
  until CONDITION;do
  statement
  done
進入循環,條件不滿足
退出循環,條件滿足
  
練習:寫一個腳本
要求用戶輸入一條信息,將里面的小寫字符全部換成大寫的
#!/bin/bash
read -p "Input something" STRING
while [ $STRING != 'quit' ];do
echo $STRING|tr 'a-z' 'A-Z'
read -p "Input something,again" STRING
done
 
#!/bin/bash
read -p "Input something" STRING
until [$STRING == 'quit' ];do
echo $STRING|tr 'a-z' 'A-Z'
read -p "Input something,again" STRING
done
 
練習:寫一個腳本
每隔5秒鍾查看hadoop是否登錄,如果登錄就退出,否則一直執行
#!/bin/bash
who|grep "hadoop" &>/dev/null
RETVAL=$?
while [ $RETVAL -ne 0 ];do //沒登錄
echo "`data`,hadoop is not logged"
sleep 5
who|grep "hadoop" &>/dev/null
RETVAL=$?
done
echo "hadoop is logged in"
 
#!/bin/bash
who|grep "hadoop" &> /dev/null
RETVAL=$?
until [ $RETVAL -eq 0 ];do //沒登錄
echo "`data`,hadoop is not logged"
sleep 5
who|grep "hadoop" &> /dev/null
RETVAL=$?
done
echo "hadoop is logged in"
 
8.循環控制的方法
    在while,until , for循環結構中
      break:提前退出循環
      continue:提前進入下一輪循環
練習:寫一個腳本計算1-100以內奇數得和
  #!/bin/bash
  let SUM=0
  let I=0
  while [ $I -lt 100 ];do
  let I++
  if [ $[$I%2] -eq 0 ];then
  continue; //如果是偶數則提前進入下一輪循環
  fi
  let SUM+=$I
  done
echo $SUM

          

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM