Linux shell腳本編程 1 流程式控制制: 2 迴圈語句:for,while,until 3 4 while迴圈: 5 6 while CONDITION; do 7 迴圈體 8 done 9 10 進入條件:當CONDITION為“真”; 11 退出條件:當CONDITION為“假”; 12
Linux 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 函數執行開始,至函數返回結束;