【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 函数执行开始,至函数返回结束;