Linux shell脚本编程(三)

时间:2022-07-13 15:35:52

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