shell指令碼編程之for語句、if語句使用介紹_linux shell

來源:互聯網
上載者:User

上部:

面向過程:
順序執行
選擇執行: if, case
迴圈執行: for, while, until

一、for語句

  格式:
     for 變數 in 列表;do
        語句1;
        語句2;
        ...
     done
   例1、寫一個指令碼,添加10個使用者,並讓每個使用者的密碼同使用者名稱】

複製代碼 代碼如下:

       #!/bin/bash
       for I in {1..10}; do
          useradd user$I;
       echo user$I | passwd --stdin user$I
       done

  例2、寫一個指令碼,分別顯示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三個檔案的時間戳記,並將這三個檔案被修改的時間改為201003030303.03

複製代碼 代碼如下:

        #!/bin/bash
        for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

           stat $Dir
           touch -m -t 201003030303.03 $Dir
           stat $Dir
        done

bash的變數類型:
    本地變數
    局部變數
    環境變數
    位置變數 :$1、$2、$3、$4....
    特殊變數:
        $?: 用於儲存剛剛執行的命令的狀態傳回值;
0:成功執行;1-255:失敗,1,2,127
可以使用exit命令在指令碼中自訂指令碼執行狀態傳回值;如果不定義,指令碼執行狀態返
回值取決於指令碼執行結束前最後執行的那個語句的狀態;

       $@, $*: 所有位置參數;
       $#: 位置參數的個數;
       $0: 指令碼名稱

二、if語句

1、單分支if語句:
      格式:
          if 條件; then
語句1
語句2
  ...
           fi
     例3、寫一個指令碼,實現如下功能: 如果使用者存在,就說明其存在;

複製代碼 代碼如下:

#!/bin/bash
   UserName=user1
 if grep "^$UserName\>" /etc/passwd &> /dev/null; then
    echo "$UserName exists."
 fi

    例4、寫一個指令碼,實現如下功能:如果裝置/dev/sda3已經掛載,就顯示其掛載點;
複製代碼 代碼如下:

#!/bin/bash
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
   mount | grep "/dev/sda3" | cut -d' ' -f3
fi

例5、寫一個指令碼,實現如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就顯示其空白行數;

複製代碼 代碼如下:

    #!/bin/bash
     File='/etc/rc.d/rc.sysinit'
    if grep "^$" $File &> /dev/null; then
     grep "^$" $File | wc -l
    fi

2、雙分支if語句:

  格式:
   if 條件; then
 語句1
 語句2
 ...
else
 語句1
 語句2
 ...
fi

   例6、寫一個指令碼,實現如下功能:

     如果裝置/dev/sda3已經掛載,就顯示其掛載點;否則,就說明其未掛載或裝置不存在;

複製代碼 代碼如下:

        #!/bin/bash
          Device='/dev/sda3'
        if mount | grep "^$Device" &> /dev/null; then

           mount | grep "/dev/sda3" | cut -d' ' -f3
        else
          echo "$Device not mounted or not exist."
        fi

3、多分支if語句:
    格式:
    if 條件1; then
 語句1
 語句2
 ...
elif 條件2; then
 語句1
 語句2
 ...
elif 條件3; then
 語句1
 語句2
 ...
else
 語句1
 語句2
 ...
fi
   例7、寫一個指令碼:
      判斷當前主機的CPU生產商,其資訊在/proc/cpuinfo檔案中vendor id一行中。
      如果其生產商為GenuineIntel,就顯示其為Intel公司;
      如果其生產商為AuthenticAMD,就顯示其為AMD公司;
     否則,就顯示無法識別;

複製代碼 代碼如下:

    #!/bin/bash
       Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
       if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then

         echo "intel"
       elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then
         echo "AMD"
       else
         echo "Unknown"
       fi

下部:

一、bash條件測試:
     整數測試   [ expression ]
     字元測試     [[ expression ]]
     條件測試     test expression   test 根據運算式求值的結果返回 0(真)或 1(假)

1、整數測試:數值比較
         -gt   大於
         -ge   大於或等於
         -eq   等於
         -lt   小於
         -le   小於或等於
         -ne    不等於

例1:寫一個指令碼,產生兩個隨機數,比較其大小;顯示大數;

bash有個內建變數:$RANDOM

複製代碼 代碼如下:

#!/bin/bash
  A=$RANDOM
  B=$RANDOM
if [ $A -ge $B ]; then
  echo "Max number is $A."
else
  echo "Max number is $B."
fi

例2:寫一指令碼,隨機產生一個整數,判定,顯示其奇偶性;

複製代碼 代碼如下:

#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
  echo "$A: Even"
else
  echo "$A: Odd"
fi

例3、寫一個指令碼:

計算100以內所有奇數的和以及所有偶數的和;分別顯示之;

複製代碼 代碼如下:

#!/bin/bash
EvenSum=0
OddSum=0
for I in {1..100}; do
  if [ $[$I%2] -eq 0 ]; then
    EvenSum=$[$EvenSum+$I]
  else
    OddSum=$[$OddSum+$I]
  fi
done
echo "EvenSum is: $EvenSum. OddSum is: $OddSum."

例4、計算N以內所有奇數的和以及所有偶數的和;分別顯示之;N是通過參數傳遞過來的正整數;

複製代碼 代碼如下:

#!/bin/bash
EvenSum=0
OddSum=0
for I in `seq 1 $1`;do
  if [ $[$I%2] -eq 1 ]; then
    OddSum=$[$OddSum+$I]
  else
    EvenSum=$[$EvenSum+$I]
  fi
done
echo "EvenSum: $EvenSum."
echo "OddSUm: $OddSum."
echo "Sum: $[$EvenSum+$OddSum]"

例5、寫一個指令碼,完成以下要求:

     1、添加10個使用者user1, user2, ..., user10;但要先判斷使用者是否存在,不存在而後再添加;
     2、添加完成後,顯示一共添加了幾個使用者;當然,不能包括因為事先存在而沒有添加的;
     3、最後顯示當前系統上共有多少個使用者;

複製代碼 代碼如下:

#!/bin/bash
Count=0
for I in {1..10}; do
  if id user$I &> /dev/null; then
    echo "user$I exists."
  else
    useradd user$I
    echo "Add user$I successfully."
    Count=$[$Count+1]
  fi
done
echo "Add $Count new users."
echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."

2、bash字元測試:
       >: 大於
       <: 小於
      ==: 等於
      =~: 判斷左邊的字串是否能夠被右邊的模式所匹配;通常用於[[]];
         [[ $opt1 =~ $opt2 ]]一般做行首、行尾錨定;不要加引號
 單目:
     -z $STRING: 為空白則為真,不空則為假;
     -n $STRING: 為空白則為假,不空則真;

例6、寫一個指令碼,判定使用者的shell是否為bash;

複製代碼 代碼如下:

#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ "$Shell" == "/bin/bash" ]; then
  echo "Bash User."
  Ret=0
else
  echo "Not Bash User."
  Ret=9
fi
exit $Ret

例7、根據使用者shell的結束符是否為sh來判定其是否為登入使用者:

複製代碼 代碼如下:

#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
  echo "No shell."
  exit 3
fi
if [[ "$Shell" =~ sh$ ]]; then
  echo "Login User."
  Ret=0
else
  echo "None Login User."
  Ret=4
fi
exit $Ret

二、bash測試之檔案測試:

    操作符 檔案路徑
       -f: 測試其是否為普通檔案,即ls -l時檔案類型為-的檔案;
       -d: 測試其是否為目錄檔案,即ls -l時檔案類型為d的檔案;
       -e: 測試檔案是否存在;存在為真,否則為假;
       -r: 測試檔案對目前使用者來說是否可讀;
       -w: 測試檔案對目前使用者來說是否可寫;
       -x: 測試檔案對目前使用者來說是否可執行;
       -s: 測試檔案大小是否不空,不空則真,空則假;
短路操作:只要前半段已經可以決定最終結果,後半段就不再運算;
 與運算:
   真 && 真 =  真
   真 && 假 =  假
   假 && {真|假} = 假


 或運算:
   假 || 0 = 0
   假 || 1 = 1
   真 ||   =1

例8、給定一個路徑,判斷如果為普通檔案,顯示之;如果為目錄,顯示之;
      否則,說無法識別;

複製代碼 代碼如下:

#!/bin/bash
if [ ! -e $1 ]; then
  echo "No such file."
  exit 7
fi
if [ -f $1 ]; then
  echo "Common file."
elif [ -d $1 ]; then
  echo "Directory."
else
  echo "Unknown file."
fi

綜合例子:
寫一個指令碼:可以接受一個參數,其使用形式如下:
script.sh {start|stop|restart|status}
如果參數為start,建立空檔案/var/lock/subsys/script,並顯示“Starting script successfully.”;
如果參數為stop,則刪除檔案/var/lock/subsys/script,並顯示“Stop script finished.”;
如果參數為restart,則刪除檔案/var/lock/subsys/script後重新建立,並顯示“Restarting script successfully.”;
如果參數為status,那麼:
如果/var/lock/subsys/script檔案存在,則顯示為“script is running.”
否則,則顯示為“script is stopped.”
其它任何參數:則顯示“script.sh {start|stop|restart|status}”

複製代碼 代碼如下:

#!/bin/bash
if [ $1 == start ] ;then
   touch /var/lock/subsys/script
   echo "Starting script successfully."
 elif [ $1 == stop ] ; then
    rm -f /var/louk/subsys/script
    echo "Stop script finished."
 elif [ $1 == restart ];then
     rm -f /var/louk/subsys/script
     touch  /var/lock/subsys/script
    echo "Restarting script successfully."
  elif [ $1 == status ];then
     [ -e /var/lock/subsys/script ]&& echo "script is running." || echo "script is stopped."
 else
   echo "script.sh {start|stop|restart|status}"
fi

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.