Linux shell脚本编程(一),linuxshell脚本编程


  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 使用至少三种方法实现;

 

相关内容