Linux shell脚本编程(二)
1 练习:求100以内所有偶数之和;
2 使用至少三种方法实现;
3
4 示例1:
5
6 #!/bin/bash
7 #
8 declare -i sum=0 #声明一个变量求和,初始值为0
9
10 for i in $(seq 0 2 100); do
11 sum=$(($sum+$i))
12 done
13
14 echo "Even sum: $sum."
15
16 示例2:
17
18 #!/bin/bash
19 #
20 declare -i sum=0
21
22 for i in {1..100}; do
23 if [ $[$i%2] -eq 0 ]; then
24 sum=$[$sum+$i]
25 fi
26 done
27
28 echo "Even sum: $sum."
29
30 增强型赋值:
31 +=
32 sum=$[$sum+$i]
33 let sum+=$i
34 -=,*=,/=,%=,
35
36 let count=$[$conunt+1] -->let count+=1-->let count++
37 let count=$[$conunt-1] -->let count-=1-->let count--
38
39
40 示例:显示/etc目录下所有的每个普通文件,而后统计一共有多少个这样的文件;
41
42 #!/bin/bash
43 #
44 declare -i count=0
45
46 for file in /etc/*; do
47 if [ -f $file ]; then
48 let count++
49 echo "$count $file"
50 fi
51 done
52
53 echo "Total: $count files."
54
55
56 测试表达式:
57 整数测试;-gt,-lt,-ge,-le,-eq,-ne
58 字符串测试:==,>,<,!=,-z,-n,=~
59
60 注意:
61 (1)字符串等会比较测试[ "$hostname" == 'localhost' ]
62 (2)模式匹配测试:[[ "STRING" -~ PATTERN ]]
63
64 示例:写一个脚本实现如下功能;
65 获取当前主机的主机名:
66 如果当前主机的主机名为空,或者为localhost,则将其修改为www.mageedu.com
67
68 组合测试条件:
69 条件间逻辑运算:
70 与:多个条件要同时满足;
71 或:多个条件满足其一即可;
72 非:对指定的条件取反;
73
74 表达式组合:
75 与:[[ CONDITION -a CONDITION2 ]]
76 或:[[ CONDITION -o CONDITION2 ]]
77 非:[ !CONDITION ]
78
79 命令组合:
80 与:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
81 或:COMMAND1 || COMMAND2
82 非:!COMMAND
83
84 false && true = false
85 false && false = false
86
87 true && false = true
88 true && true = true
89
90 if COMMAND; then
91 COMMAND2
92 fi
93 短路操作符:
94 true || true = true
95 true || false = true
96
97 false || true = true
98 false || false = false
99
100 if ! COMMAND1; then
101 COMMAND2
102 fi
103
104 COMMAND1 && COMMAND2 || COMMAND3
105 if COMMAND1;then
106 COMMAND2
107 else
108 COMMAND3
109 fi
110
111 获取当前主机的主机名:
112 如果当前主机的主机名为空,或者为localhost,则将其修改为www.mageedu.com
113
114 #!/bin/bash
115 #
116 hostname=$(hostname)
117
118 if [ -z "$hostname" -o "$hostname"=="localhost" ]; then
119 hostname www.magedu.com
120 fi
121
122 练习:写一个脚本
123 (1)传递两个文本文件路径给脚本;
124 (2)显示两个文件中空白行数较多的文件及其空白行的个数;
125 (3)显示两个文件中总行数较多的文件及其总行数;
126 练习:写一个脚本
127 (1)提示用户输入一个字符串;
128 (2)判断:
129 如果输入的是quit,则退出脚本;
130 否则,则显示其输入的字符串内容;
131
132 练习:写一个脚本,打印九九乘法表:
133 循环嵌套
134
135 #!/bin/bash
136 #
137 for j in {1..9}; do
138 for i in $(seq 1 $j); do
139 echo -n -e "${i}X${j}=$[$i*$j]\t"
140 done
141 echo
142 done
143
144 多分支的if语句:
145 单分支:
146 if CONDITION; then
147 if-true-分支
148 fi
149 双分支:
150 if CONDITION; then
151 if-true-分支
152 else
153 if-false-分支
154 fi
155
156 多分支:
157 if CONDITION1; then
158 if -CONDITION-true-分支
159 elif CONDITION2; then
160 if-CONDITION2-true-分支
161 ...
162 else
163 if-ALL-false-分支
164 fi
165
166 示例:通过脚本参数传递一个文件路径给脚本,判断其类型:
167
168 #!/bin/bash
169 #
170 if [ $# -lt 1 ]; then
171 echo "Usage: $0 <path>"
172 exit 1
173 fi
174
175 if [ -f $1 ]; then
176 echo "Rgulat file."
177 elif [ -d $1 ]; then
178 echo "Directory."
179 elif [ -h $1 ]; then
180 echo "Symbolic link."
181 elif [ -b $1 ]; then
182 echo "Block special."
183 elif [ -c $1 ]; then
184 echo "Charactoer special."
185 elif [ -S $1 ]; then
186 echo "Socket file."
187 else
188 echo "file not exist or unknow type."
189 fi
190
191 示例:脚本可接受四个参数
192 start:创建文件/var/lock/subsys/SCRIPT_NAME
193 stop:删除此文件
194 restatr:删除此文件并重新创建
195 status:如果文件存在,显示为“running”;否则,显示为“stopped”
196
197 basename命令:
198 取得路径的基名:
199 示例:
200
201 #!/bin/bash
202 #
203 prog=$(basename $0)
204 lockfile="/var/lock/subsys/$prog"
205 #echo $lockfile
206
207 if [ $# -lt 1 ]; then
208 echo "Usage: $prog start|stop|restart|status"
209 exit 1
210 fi
211
212 if [ "$1" == "start" ]; then
213 if [ -f $lockfile ]; then
214 echo "$prog is started yes."
215 else
216 touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
217 fi
218 elif [ "$1" == "stop" ]; then
219 if [ -f $lockfile ]; then
220 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
221 else
222 echo "$prog is stopped yet."
223 fi
224 elif [ "$1" == "restart" ]; then
225 if [ -f $lockfile ]; then
226 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
227 else
228 touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
229 fi
230 elif [ "$1" == "status" ]; then
231 if [ -f $lockfile ]; then
232 echo "Running..."
233 else
234 echo "Stopped..."
235 fi
236 else
237 echo "Usage: $prog start|stop|restart|status"
238 exit 1
239 fi
240
241 case语句:
242 简洁版多分支if语句:
243 使用场景:判断某变量的值是否为多种情形中的一种时使用;
244
245 语法:
246 case $VARIABLE in
247 PATTERN1)
248 分支1
249 ;;
250 PATTERN2)
251 分支2
252 ;;
253 PATTERN3
254 分支3
255 ;;
256 ...
257 *)
258 分支n
259 ;;
260 esac
261
262 PATTERN可使用glob模式的通配符:
263 *:任意长度的任意字符;
264 ?:任意单个字符;
265 []:指定范围内的任意单个字符;
266 a|b:多选1;
267
268 示例:提示键入任意一个字符,判断类型:
269 脚本如下:
270 #!/bin/bash
271 #
272 read -p "Plz enter a character: " char
273
274 case $char in
275 [a-z])
276 echo "A character."
277 ;;
278 [0-9])
279 echo "A digit."
280 ;;
281 *)
282 echo "A special character."
283 ;;
284 esac
285
286 示例:脚本可接受四个参数
287 start:创建文件/var/lock/subsys/SCRIPT_NAME
288 stop:删除此文件
289 restatr:删除此文件并重新创建
290 status:如果文件存在,显示为“running”;否则,显示为“stopped”
291
292 脚本如下:
293
294 #!/bin/bash
295 #
296 prog=$(basename $0)
297 lockfile="/var/lock/subsys/$prog"
298 #echo $lockfile
299
300 if [ $# -lt 1 ]; then
301 echo "Usage: $prog start|stop|restart|status"
302 exit 1
303 fi
304 case $1 in
305 start)
306 if [ -f $lockfile ]; then
307 echo "$prog is started yes."
308 else
309 touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."
310 fi
311 ;;
312 stop)
313 if [ -f $lockfile ]; then
314 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."
315 else
316 echo "$prog is stopped yet."
317 fi
318 ;;
319 restart)
320 if [ -f $lockfile ]; then
321 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."
322 else
323 touch $lockfile && echo "$prog is stopped, Starting $prog ok..."
324 fi
325 ;;
326 status)
327 if [ -f $lockfile ]; then
328 echo "Running..."
329 else
330 echo "Stopped..."
331 fi
332 ;;
333 *)
334 echo "Usage: $prog start|stop|restart|status"
335 exit 1
336 esac