shell指令碼學習:循序漸進程式選擇流與Regex

來源:互聯網
上載者:User
 

        shell指令碼和其他程式設計語言一樣提供了程式執行流if esle , do while ,for ,case,等。和其他程式設計語言一樣,shell指令碼的程式執行流的存在是為建立完整的邏輯思維,通過下面幾個指令碼來慢慢學習程式執行流。
首先是if else迴圈與do while迴圈的格式:
單分支:
if CONDITION ; then                             //需要注意CONDITION語句的格式:[ command ] command左右各有一個空格鍵,並用[ ]括起來
 statement                                         //statement可以是多條語句
 ...
fi
雙分支:
if CONDITION ; then
 statement
 ...
 else
 statement
 ...
fi
多分支:
if CONDITION ; then
 statement
 ...
elif CONDITION ; then
  statement
  ...
fi 
我們來分析一下這個執行流的意思,
第一種:如果條件成立,那麼執行statement,也就是說如果不成立,那麼就不執行,直接到fi,執行下一個命令,這樣的選擇可以
讓我們輕鬆的過濾一個條件;例如:如果  [一個人犯法了]  那麼  [他就是壞人]       等於預設如果一個人沒有犯法,那麼他就不是壞人.
第二種:如果條件成立,那麼執行statement,執行後到fi,如果不成立,那麼執行else裡的statement,執行後到fi, 它可以讓我們指定兩種分支來處理一個條件。
例如:如果 [一個人犯法了] 那麼 [他就是壞人] 否則 那麼 [他就是一個有待觀察的人]   等於在第一種的基礎上,又添加了一個處理
第三者:這一種,是第一種和第二種的結合,你可以使用elif 來細化 else的條件 ,既在else裡使用if else迴圈,這樣可以細化很多條件並處理,從而得到我們想要
的結果。
————————————————————————————————————————————————————————————————————————————————
do while 迴圈的格式:
while COMMAND; do
  statemnet;
  ....
  CONDITION
done
解析:while迴圈可以協助我們實現一種“迴圈的處理”,也就是說不斷的處理一個或者一些內容,或者是不斷的執行某個或某些命令
例如用while迴圈來計算1~100的和
let N=1
let S=0
while [ N -le 100 ]; do          //-le小於或等於
    S=${$N+$S}                   //設一個計數器S 它等於上一次的S和這一次的N相加,實現累加
    N++                              //N自增1
done                                 //注意while迴圈解說要加done
echo S                               //輸出結果
————————————————————————————————————————————————————————————————————————————————
for 迴圈
for I in LIST ; do
  statement1
  statement2
done
LIST的格式: 簡單列表: 1 2 3 4
              複雜列表: This is TOM`s cat
              命令    : `ls /var`
              萬用字元  : for I in /var/*
列表可是說是for迴圈的核心,列表可以是命令,數字,文本,甚至是路徑。它的處理方法靈活多變,在很多時候for迴圈的時候可以很清晰明了完成邏輯關係。

下邊通過幾個例子,來學習這些常見的程式執行流。
寫一個指令碼:
1、判斷一個指定的指令碼是否是語法錯誤;如果有錯誤,則提醒使用者鍵入Q或者q無視錯誤並退出,其它任何鍵可以通過vim開啟這個指定的指令碼;
2、如果使用者通過vim開啟編輯後儲存退出時仍然有錯誤,則重複第1步中的內容;否則,就正常關閉退出。c
##使用read -p命令,可以讓列印提示資訊並讓使用者輸入一個變數的值
#!/bin/bash
#TEST=`bash +n $1`                  //測試指令碼是否有語句錯誤
if [ $TEST!=0 ]; then                   //如果有錯誤,往下執行,否則,執行else語句
   read -p “Q|q for quiting:”INPUT   //提示按q或Q退出,並要求使用者輸入
  if [ "$INPUT" == 'Q' -o "$INPUT" == 'q' ];then            //判斷輸入的資訊
  echo "quiting"                                                              
  else
    while [ $TEST!=0 -a "$INPUT" != 'Q' ]; do        //迴圈判斷,如果還有錯誤並且沒有輸入Q
      vim $1                                          //開啟vim編輯
      TEST=`bash +n $1`                                  //再一次測試語法錯誤
      read-p "Q|q for quiting:" INPUT            //再一次提示是否退出
      INPUT=`echo "$INPUT" | tr 'a-z' 'A-Z'`          //這裡將使用者輸入的小寫字母變為大寫
    done
  fi
fi
unset TEST INPUT
##此指令碼運用了一個多支if else迴圈,和一個for迴圈,在判斷使用者輸入時,第一個簡單的if語句即可實現,但是第二個需將其轉換為大寫來滿足指令碼要求。

 

寫一個指令碼:
1、向系統中添加20個使用者,名字為linuxer1-linuxer20,密碼分別為其使用者名稱,要使用while迴圈;
2、要求:在添加每個使用者之前事先判斷使用者是否存在,如果已經存在,則不再添加此使用者;
3、添加完成後,顯示linuxer1-linuxer20每個使用者名稱及對應的UID號碼和GID號碼,形如

#!/bin/bash

#

FILE=/etc/passwd
let N=1
while [ $N -le 20 ] ; do
  grep "linuxer$N" $FILE >> /dev/null || useradd "linuxer$N";echo "linuxer$N" | passwd --stdin "linuxer$N"       //    ||  或運算,條件不成立則執行下面的語句,成立則不執行下一條語句
let N++
done
for I in {1..20}; do                          //for迴圈,從1~20執行                     
  grep "linuxer$I" $FILE |             //抓取使用者名稱linuxer1~20
    awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}'         //awk語句,在下一篇文章介紹
done

 

 

 

 

 

 

 

 

相關文章

聯繫我們

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