Linux shell腳本編程(三)

Linux shell腳本編程shell

 

  1 流程控制:
  2        循環語句:for,while,until
  3 
  4        while循環:
  5 
  6            while CONDITION; do
  7                循環體
  8             done
  9 
 10             進入條件:當CONDITION爲「真」;
 11             退出條件:當CONDITION爲「假」;
 12 
 13             while CONDITION; do
 14                 循環體
 15                 控制變量的修正表達式
 16             done
 17 
 18             示例:求100之內全部正整數之和;
 19                         #!/bin/bash
 20                         #
 21                         declare -i sum=0
 22                         declare -i i=1
 23 
 24                         while [ $i -le 100 ]; do
 25                               let sum+=$i
 26                               let i++
 27                         done
 28 
 29                         echo "Sum: $sum."
 30 
 31         練習:分別求100之內全部奇數之和,及全部偶數之和;
 32 
 33         示例:打印九九乘法表;
 34                   #!/bin/bash
 35                   #
 36                   declare -i i=1
 37                   declare -i j=1
 38 
 39                   while [ $j -le 9 ]; do
 40                        while [ $i -le $j ]; do
 41                             echo -e -n "${i}X${j}=$[$i*$j]\t"
 42                             let i++
 43                        done
 44                        echo
 45                        let i=1
 46                        let j++
 47                   done
 48 
 49         until循環:
 50              until CONDITION; do
 51                    循環體
 52                    循環控制變量的修正表達式
 53               done
 54 
 55               進入條件:當CONDITION爲「假」時
 56               退出條件:當CONDITION爲「真」時
 57 
 58               示例:求100之內正整數之和;
 59               #!/bin/bash
 60               #
 61               declare -i sum=0
 62               declare -i i=1
 63 
 64               until [ $i -gt 100 ]; do
 65                    let sum+=$i
 66                    let i++
 67               done
 68 
 69               echo "Sum:$sum."
 70         練習1:分別求100之內全部偶數之和,以及全部奇數之和;
 71         練習2:實現九九乘法表;
 72         練習3:分別使用while和until循環實現添加10個用戶:user-user10;
 73 
 74       循環控制:
 75            continue:提早結束本輪循環,而直接進入下一輪;
 76            break [n]:提早結束循環;
 77           
 78            while CONDTION;do
 79               .......
 80                if CONDITION; then
 81                    break [n]
 82                fi
 83            done
 84 
 85            while CONDTION;do
 86               .......
 87                if CONDTION2; then
 88                    continue [n]
 89                fi
 90                .......
 91 
 92                示例:求100之內全部偶數之和;
 93                 #!/bin/bash
 94                 #
 95                 declare -i sum=0
 96                 declare -i i=0
 97 
 98                 while [ $i -le 100 ]; do
 99                      let i++
100                      if [ $[$i%2] -eq 1 ]; then
101                          echo "$i is a odd."
102                          continue
103                      fi
104                      let sum+=$i
105                 done
106 
107                 echo "Sum:$sum."
108 
109           死循環:
110               while true; do
111                    循環體
112                    if CONDITION; then
113                       break
114                    fi
115                 done
116 
117                 until false; do
118                    循環體
119                    if CONDITION; then
120                       break
121                    fi
122                 done
123 
124             示例;每隔3秒鐘查看當前系統是否有名爲'gentoo'的用戶登陸;
125                若是其次查看gentoo登陸了,則顯示gentoo已經登陸;
126                若是未登陸,就顯示仍然未開始,並顯示這是已是第多少次查看了;
127 
128                 #!/bin/bash
129                 #
130                 username=$1
131                 declare -i count=0
132 
133                 while true; do
134                    if  who | grep "^$username" &> /dev/null; then
135                          echo "$username is logged."
136                          break
137                    else
138                        let count++
139                        echo "$count $username is not login."
140                    fi
141                    sleep 3
142                 done
143 
144             示例:2
145 
146                 #!/bin/bash
147                 #
148                 declare -i count=0
149                 username=$1
150 
151                 if [ $# -lt 1 ]; then
152                     echo "At lease one argument."
153                     exit 1
154                 fi
155 
156                 if ! id $username &> /dev/null; then
157                     echo "No such user."
158                     exit 2
159                 fi
160 
161                 until who | grep "^$username" &> /dev/null; do
162                     let count++
163                     echo "$count $username is not login."
164                     sleep 3
165                 done
166                 echo "$username is logged on."
167 
168 
169         while循環的特殊用法:
170             遍歷文件的每一行:
171                 while read VARIABLE; do
172                     循環體
173                 done < /PATH/FROM/SOME_FILE
174 
175             示例:找出UID爲偶數的全部用戶顯示其用戶名和ID號;
176             #!/bin/bash
177             #
178             while read line; do
179                 userid=$(echo $line | cut -d: -f3)
180                 if [ $[$userid%2] -eq 0 ]; then
181                   echo $line | cut -d: -f1,3
182                 fi
183             done < /etc/passwd
184 
185 
186         for循環的特殊用法:
187            for((expr1;expr2;expr3)); do
188                循環體
189            done
190 
191            expr1:定義控制變量,並初始賦值;
192            expr2:循環控制條件;
193                 進入條件:控制條件爲「真」
194                 退出條件:控制條件爲「假」
195 
196            expr3:修正控制變量
197 
198             示例:求100之內全部正整數之和;
199 
200       練習1:打印九九乘法表:
201       練習2:傳遞一個文本文件爲參數給腳本,取出此文件的全部的偶數行給予顯示,行前要顯示行號;
202 
203     函數:
204        function:功能
205           把一段具備獨立功能代碼封裝在一塊兒,並給予命名;後續用到時,可直接經過給定函數名來調用總體代碼;
206 
207           函數做用:
208               代碼重用:
209               模塊化編程:
210 
211         函數的使用方法:
212             先定義:編寫函數代碼
213             後調用:給出函數名,還能夠按需傳遞參數;
214 
215         定義方法:
216         (1)function f_name {
217                  函數體
218              }
219          (2)f_name() {
220                  函數體
221              }
222 
223         調用函數:
224             f_name [argu1,argu2,...]
225 
226         自定義函數狀態返回值:
227              return [#]
228                   0:成功
229                   1-255:失敗
230                   注意:函數代碼執行時,一旦遇到return,函數代碼終止運行,函數返回;
231         示例:此前的服務腳本
232 
233         #!/bin/bash
234         #
235         prog=$(basename $0)
236         lockfile="/var/lock/subsys/$prog"
237         #echo $lockfile
238 
239         if [ $# -lt 1 ]; then
240            echo "Usage: $prog start|stop|restart|status"
241            exit 1
242         fi
243 
244         start() {
245             if [ -f $lockfile ]; then
246                 echo "$prog is started yes."
247             else
248                touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
249             fi
250         }
251         stop() {
252             if [ -f $lockfile ]; then
253                 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
254             else
255                 echo "$prog is stopped yet."
256             fi
257         }
258         restart() {
259             if [ -f $lockfile ]; then
260                 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
261             else
262                 touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
263             fi
264         }
265         status() {
266             if [ -f $lockfile ]; then
267                 echo "Running..."
268             else
269                 echo "Stopped..."
270             fi
271         }
272 
273         case $1 in
274         start)
275              start
276              ;;
277         stop)
278             stop
279              ;;
280         restart)
281              restart
282              ;;
283         status)
284              status
285              ;;
286 
287         *)
288             echo "Usage: $prog start|stop|restart|status"
289             exit 1
290         esac
291     示例:判斷用戶ID號的奇偶性
292 
293     #!/bin/bash
294     #
295     evenid() {
296        if [ $# -lt 1 ]; then
297            return 1
298        fi
299        
300        if ! id $1 &> /dev/null; then
301            return 2
302        fi
303       
304        userid=$(id -u $1)
305        if [ $[$userid%2] -eq 0 ]; then
306           echo "$1,Even user ID."
307        else
308           echo "$1,Odd user ID."
309        fi
310     }
311 
312     evenid root
313 
314     evenid
315     echo $?
316 
317     evenid rooooooot
318     echo $?
319 
320    模塊化編程
321        示例:
322           架設/root/bin/srv目錄有兩個文件:
323            (1)函數文件
324            (2)腳本文件
325 
326     爲腳本使用配置文件
327         一個文件中只定義變量
328         腳本文件source此變量定義的文件
329 
330     變量的做用域:
331          局部變量:
332             local VARIABLE=value
333 
334          存活時間:
335             函數執行開始,至函數返回結束;
相關文章
相關標籤/搜索