1 Linux shell脚本编程:
2 守护进程,服务进程:启动?开机时自动启动:
3 交互式进程:shell应用程序
4
5 广义:GUI,CLI
6 GUI:
7 CLI:
8 词法分析:命令,选项,参数
9 内建命令:
10 外部命令:PATH
11 fork()创建为一个进程:
12
13 把要运行的一系列命令,写在文件中:
14 脚本或程序源文件:文本文件
15 两种方式:
16 编译执行:预处理---->编译---->汇编---->链接:事先完成,结果:二进制程序文件
17 C,C++
18 解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;
19 Python:程序库
20 程序控制结构:调用编程库完成编程编写;
21 库文件:功能模块,在编程中可调用;通过其API:应用编程接口;
22 Bash:程序
23 程序控制结构,调用机器上命令程序文件进行编程编写;
24 外部命令:各应用程序提供;
25 程序:指令+数据
26 算法+数据结构
27
28 过程式编程:以指令为中心,设计算法,数据服务于算法;
29 对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;
30
31 bash过程式编程:
32 顺序执行:逐个执行
33 选择执行:只执行其中一个分支
34 循坏执行:一段代码要执行0,1或多遍
35
36 编程元素:变量、流程、函数
37
38 变量:可变化的量,命名内存空间
39
40 bash环境:
41 本地变量:当前shell进程;
42 环境变量:当前shell进程及其子进程;
43 局部变量:某个函数执行过程;
44 位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
45 特殊变量:$?,$*,$@,$#,$$
46
47 变量类型:
48 数值,字符:
49
50 数值:
51 整数
52 浮点数
53 字符:
54 ASCII
55 120:
56 字符:1, 2 , 0
57 数值:120 --->
58
59 变量类型的作用:
60 存储空间
61 运算格式
62
63 语言对变量类型的支持力度:
64 强类型:
65 弱类型:变量类型不严格区分;
66 默认存储机制:bash为字符
67
68 bash的变量使用特点:弱类型、无需事先说明;
69
70 本地变量:
71 name=value
72 name:变量名
73 =:赋值符号
74 value:值
75
76 变量名:只能包含数字、字母和下划线:且不能以数字开头;
77 引用变量:${name},name
78 例:
79 [root@localhost ~]# animal="panao"
80 [root@localhost ~]# echo ${animal}
81 panao
82 引用:
83 弱引用:"",其内部的变量引用会替换为变量值;
84 强引用:'',其内部的变量引用会保持原有字符;
85 命令引用:`COMMAND`,$(COMMAND),引用命令的执行结果;
86
87 声明为整型:
88 declare -i name[=value]
89 let name=value
90
91 生命周期:
92 创建
93 销毁:
94 自动销毁:shell进程终止;
95 手动销毁:unset name
96 例:
97 [root@localhost ~]# unset animal
98
99 环境变量:
100 被"导出"的本地变量
101 export name[=value]
102 declare -x name[=value]
103
104 查看所有环境变量:env,printenv,export
105
106 销毁:
107 unset name
108
109 脚本:文本文件
110 运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后有bash进程负责解析并运行此逻辑;
111 启动脚本:
112 (1) #bash /PATH/TO/SCRIPT_FILE
113 (2)一个执行权限,
114 # ./PATH/TO/SCRIPT_FILE
115
116 shebang:
117 #!/bin/bash
118
119 第一行:顶格给出shebang
120 注释行:#
121
122 bash的常用选项:
123 -n:检查脚本中的语法错误;
124 -x:调试执行脚本;
125
126 命令的状态结果:
127 bash进程用于追踪执行的命令成功与否的状态;
128 0:成功
129 1-222:失败
130
131 特殊变量:
132 $?:上一条命令的执行状态结果;
133 例:
134 [root@localhost bin]# echo $?
135 0 // 0表示成功
136
137
138 布尔型:
139 "真":成功
140 "假":失败
141
142 自定义脚本的状态结果:
143 exit[n]
144
145 注意:脚本中任何位置执行了exit命令即会终止当前shell进程;
146
147 条件测试:
148 界定程序执行环境:
149
150 (1)根据运行的命令的状态结果;
151 (2)测试表达式
152 test EXPRESSION
153 [ EXPRESSION ] //括号两边必须有空格
154 [[ EXPRESSION ]] //括号两边必须有空格
155
156 整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;
157 $A -gt $B:是否大于:是则为"真",否则为"假";
158 $A -ge $B:是否大于等于;
159 $A -lt $B:是否小于;
160 $A -le $B:是否小于等于;
161 $A -eq $B:是否等于;
162 $A -ne $B:是否不等于;
163 字符串测试:ASCII数值越大,字符比较时其值越大
164 "$A" > "$B":是否大于;
165 "$A" < "$B":是否小于;
166 "$A" == "$B":是否等于;
167 "$A" != "$B":是否不等于;
168 -z "$A":是否为空;空则为"真",否则为"假"
169 -n "$A":是否不空;不空则为"真",空则为"假"
170
171 注意:应该使用[[ EXPRESSION ]]
172
173 文件测试:测试文件的存在性以及属性;
174 -e $file:是否存在,存在则为"真",否则为"假"
175 -a $file:同上
176 -f $file:文件是否存在且为普通文件;
177 -d $file:文件是否存在且为目录;
178 -h $file:是否存在且为符号链接文件;
179 -L $file:同上;
180 -b $file:是否存在且为块设备文件;
181 -c $file:是否存在且为字符设备文件;
182 -S $file:是否存在且为套接字文件;
183 -p $file:是否存在且为管道文件;
184
185 -r $file:当前用户对文件是否拥有读权限;
186 -w $file:当前用户对文件是否拥有写权限;
187 -x $file:当前用户对文件是否拥有执行权限;
188
189 -u $file:文件是否拥有SUID权限;
190 -g $file:文件是否拥有SGID权限;
191 -k $file:文件是否拥有sticky权限;
192
193 -O $file:当前用户是否为指定文件的属主;
194 -G $file:当前用户是否为指定文件的属组;
195
196 双目操作符:
197 $file1 -nt $file2:file1是否新于file2,file1的最近一次的修改时间是否晚于file2的;
198 $file1 -ot $file2:file1是否旧于file2,file1的最近一次的修改时间是否早于file2的;
199 $file1 -ef $file2:file1与file2是否指向了同一个inode:测试二者是否为同一个文件的硬链接;
200
201
202
203 特殊设备:
204 /dev/null:空,bit buckets,吞下所有数据,并直接丢弃;
205 /dev/zero:突出一堆0:
206
207 bash之条件判断(选择执行):
208 if/then,case
209
210 if CONDITTION;then
211 if-true-分支
212 fi
213
214 if CONDITTION;then
215 if-true-分支
216 else
217 if-false-分支
218
219 !CONDITTION:取反
220
221 练习:写一个脚本
222 如果其路径不存在,则将其创建为目录,否则显示其存在,并显示内容类型;
223
224 #!/bin/bash
225 #
226 filename="/tmp/x/y/z/testdir"
227 if [ -e $filename ];then
228 echo "$filename exists."
229 file $filename
230 else
231 mkdir -p $filename
232 fi
233 ~
234 ~
235 脚本参数(位置参数变量):
236 ./script.sh /etc/fstab /etc/grub2.cfg
237 $0 $1 $2
238
239 位置参数变量:$1,$2,....
240 ${10}
241
242 特殊变量:
243 $?:命令的状态结果;
244 $#:传递给脚本或函数的参数个数;
245 $*和$@:引用传递给脚本或函数的参数列表;
246
247 shift:[n]:轮替
248
249 与用户交互:
250 read命令:
251 read [option] VAR...
252 -p "PROMPT"
253 -t timeout
254 示例:
255
256 #!/bin/bash
257 #
258
259 read -p "Plz enter a username: " -t 5 username
260
261 if [ -z "$username" ]; then
262 username="myuser"
263 fi
264
265 if id $username &> /dev/null; then
266 echo "$username exists."
267 else
268 useradd $username
269 fi
270
271
272
273 命令引用:
274 `COMMAND`,$(COMMAND)
275
276 引用命令的执行结果:
277 (1)ls `which cat`
278 (2)lines=$(wc -l /etc/fstab | cut -d '' -f1)
279
280 #!/bin/bash
281 #
282 if [ -f $1 ]; then
283 lines=$(wc -l $1 | cut -d' ' -f1)
284 echo "$1 has $lines lines."
285 else
286 echo "$1 not exists or not a file."
287 fi
288
289 练习:写一个脚本,完成如下功能:
290 判断给定的两个数值,孰大孰小;
291 给定数值的方法:脚本参数,命令交互;
292 代码如下:
293
294 1 #!/bin/bash
295 2 #
296 3 read -p "Plz enter two integer: " -t 10 num1 num2
297 4
298 5 if [ -z "$num1" ];then
299 6 echo "Plz give two integers."
300 7 exit 1
301 8 fi
302 9
303 10 if [ -z "$num2" ];then
304 11 echo "Plz give two integers."
305 12 exit 1
306 13 fi
307 14
308 15 if [$num1 -ge $num2 ];then
309 16 echo "Max: $num1,Min;$num2."
310 17 else
311 18 echo "Max:$num2,Min:$num1."
312 19 fi
313 循环语句:
314 for,while,until
315
316 循环:将循坏体代码执行0、1或多次;
317 进入条件:进入循环的条件;
318 退出条件:循环终止的条件;
319
320 for VARIABLE in LIST;do
321 循环体
322 done
323
324 LIST:是由一个或多个空格分隔开的字符串组成;
325 把列表的每个字符串逐个赋值给VARIABLE表示的变量;
326
327 for username in user1 user2 user3;do
328 循环体
329 done
330
331 进入条件:列表非空
332 退出条件:列表遍历结束;
333
334 添加5个用户:
335 #!/bin/bash
336 #
337 for username in user1 user2 user3 user4 user5; do
338 if id $username &> /dev/null; then
339 echo "$username exists."
340 else
341 useradd $username
342 echo "Add user $username finished."
343 fi
344 done
345 LIST的生成方法:
346 (1)整数列表
347 (a){start..end}
348 (b)$(seq start [[step]end])
349 (2)直接给出
350 (3)glob
351 (4)根据命令生成
352
353
354 示例:数值列表
355 #!/bin/bash
356 #
357 for i in {1..10}; do
358 if id user$i &> /dev/null; then
359 echo "user$i exists."
360 else
361 useradd user$i
362 echo "Add user user$i finished."
363 fi
364 done
365
366 示例:glob
367 #!/bin/bash
368 #
369 for filename in /var/log/*; do
370 file $filename
371 done
372
373 示例:命令生成列表
374 #!/bin/bash
375 #
376 for username in $(cut -d: -f1 /etc/passwd); do
377 echo "$username primary group: $(id -n -g $username)."
378 done
379 ~
380
381 算术运算:
382 +,-,*,%,**
383
384 sum=$a+$b
385 (1)$[$A+$B]
386 (2)$(($A+$B))
387 (3)let VARIABLE=$A+$B
388 (4)VARIABLE$(expr $A + $B)
389
390 示例:
391
392 [root@localhost bin]# a=6
393 [root@localhost bin]# b=7
394 [root@localhost bin]# sum=$a+$b
395 [root@localhost bin]# echo $a+$b
396 6+7
397 [root@localhost bin]# echo $[$a+$b]
398 13
399 [root@localhost bin]# let $a+$b
400 [root@localhost bin]# let sum=$a+$b
401 [root@localhost bin]# echo $sum
402 13
403 [root@localhost bin]# expr $a + $b
404 13
405
406 示例:求100以内正整数之和;
407 #!/bin/bash
408 #
409 declare -i sum=0
410
411 for i in {1..100}; do
412 sum=$[$sum+$i]
413 done
414
415 echo $sum
416
417 练习:求100以内所有偶数之和;
418 使用至少三种方法实现;