linux学习30 运维核心技能-shell脚本编程思想和条件测试

一、回顾

  1、文件系统管理

    管理工具:mkfs,mke2fs,e2label,tune2fs,dumpe2fs,e2fsck,blkid,mkfs.xfs,mkfs.vfat,fsck

    mkswap,swapon,swapoff

    mount,umount,fuser,lsof

    df,du

  2、fstab文件

    设备  挂载点  文件系统类型  挂载选项  转储频率  自检次序

  3、文件系统

    a、目录:文件

      元数据:inode,inode table

      数据:data blocks

        下级文件或目录的文件名与其inode对应关系

    b、文件名:每一个文件的文件名并没有存放在元数据中,而是存在于上级目录,也就是其所在的目录,因此在目录存放的对应的数据的data block中主要存放的就是其下级文件或目录的文件名与其inode的对应关系

        dentry 

  4、删除文件

    a、将此文件指向的所有data block标记为未使用状态,因此以后其它数据填充时就可以覆盖相应的磁盘块了。

    b、将此文件的inode标记为未使用,仅需要修改相应的inode表中的相应的条目的状态和各data block的其中一位的状态,并修改inode位图和data block的位图即可完成。之所以有些文件删除以后能使用所谓的文件恢复工具找回来就是这样的原因。

  5、复制和移动文件

    复制:新建文件

    移动文件:

      在同一文件系统:改变的仅是其路径

      在不同文件系统:复制数据至目标文件,并删除源文件

  6、符号链接

    权限:lrwxrwxrwx

  7、硬链接:指向同一个inode

二、bash脚本编程

  1、脚本文件格式

    第一行,顶格 #!/bin/bash

    注释信息: #

    代码注释:

    缩进,适度添加空白行

[root@node1 script]# cat first.sh 
#!/bin/bash
#description: say hello
#version: 0.0.1
#author: wohaoshuai <wohaoshuai@qq.com>
#date: 2020-01-02

  2、语言:编程语法格式,库,算法和数据结构

    编程思想:

      问题空间 --> 解空间

  3、变量:

    局部变量

    本地变量

    环境变量

    位置参数变量

    特殊变量

  4、数据类型:字符型,数值型

    弱类型:字符型

  5、算术运算

    +,-,*,/,%,**

    let VAR=$num1 op $num2

    VAR=$[expression]

    VAR=$((expression))

    VAR=$(expr argu1 argu2 argu3)

    注意:有些时候乘法符号需要转义

    增强型赋值:变量做某种算术运算后再次回存至此变量中

      let i=$i+#

      let i+=#

      +=,-=,*=,/=,%=

    自增:

      let VAR=$[$VAR+1]

      let VAR+=1

      let VAR++

    自减:

      VAR=$[$VAR-1]

      let VAR-=1

      let VAR--

[root@node1 script]# declare -i i=1
[root@node1 script]# echo $i
1
[root@node1 script]# i=$[$i+1]
[root@node1 script]# echo $i
2
[root@node1 script]# let i+=1
[root@node1 script]# echo $i
3
[root@node1 script]# cat idsum.sh 
#!/bin/bash
#
id user1 &> /dev/null || useradd user1
echo "user1 id is $(id -u user1)"
id user2 &> /dev/null || useradd user2 
echo "user2 id is $(id -u user2)"
user1_id=$(id -u user1)
user2_id=$(id -u user2)

id_sum=$[${user1_id}+${user2_id}]
echo "the id sum: $id_sum"
[root@node1 script]# bash idsum.sh 
user1 id is 5010
user2 id is 5017
the id sum: 10027

  6、练习

    a、写一个脚本

      计算/etc/passwd文件中的第10个用户和第20个用户的id号之和

        id1=$(head -10 /etc/passwd|tail -1|cut -d: -f3)

        id2=$(head -20 /etc/passwd|tail -1|cut -d: -f3)

        sum=$[$id1+$id2]

    b、写一个脚本

      计算/etc/rc.d/init.d/functions和/etc/inittab文件的空白行数之和

        grep "^[[:space:]]*$" /etc/rc.d/init.d/functions |wc -l

  7、条件测试

    a、判断某需求是否满足,需要由测试机制来实现

    b、如何编写测试表达式以实现所需的测试。

      (1)、执行命令,并利用命令状态返回值来判断

        0:成功

        1-255:失败

      (2)、测试表达式

        test EXPRESSION

        [ EXPRESSION ]:表达式前后与中括号之间必须有空白字符,否则为语法错误

        [[ EXPRESSION ]]:表达式前后与中括号之间必须有空白字符,否则为语法错误

    c、bash的测试类型

      数值测试

      字符串测试

      文件测试

      (1)、数值测试:数值比较

        -eq:是否等于;  $num1 -eq $num2

        -ne:是否不等于;

        -gt:是否大于

        -ge:是否大于等于

        -lt:是否小于

        -le:是否小于等于

      (2)、字符串测试:字符比较

        == :是否等于

[root@node1 ~]# [ tom == tom ]
[root@node1 ~]# echo $?
0
[root@node1 ~]# [ tom == wohaoshuai ]
[root@node1 ~]# echo $?
1

        > :是否大于

        <:是否小于

        !=:是否不等于

        =~:左侧的字符串是否能够被右侧的PATTERN所匹配

[root@node1 ~]# name=tom
[root@node1 ~]# [[ "$name" =~ o.* ]]
[root@node1 ~]# echo $?
0
[root@node1 ~]# [[ "$name" =~ o ]]
[root@node1 ~]# echo $?
0
[root@node1 ~]# name=jerry
[root@node1 ~]# [[ "$name" =~ o ]]
[root@node1 ~]# echo $?
1

        -z "STRING":判断指定的字符串是否为空,空则为真,不空则为假

        -n "STRING":判断指定的字符串是否不空,不空则真,空则为假

        注意:

          (1)、字符串要加引号

          (2)、要使用[[]]做字符比较

  8、脚本的状态返回值

    a、默认是脚本中执行的最后一条命令的状态返回值

    b、自定义退出状态码

      exit [n]:n为自己指定的状态码

        注意:shell 进程遇到exit 时,即会终止,因此整个脚本执行即为结束。

[root@node1 ~]# id user3 &> /dev/null && exit 0 || useradd user3 #列举user3id,若成功则退出,否则添加用户user3
原文地址:https://www.cnblogs.com/Presley-lpc/p/12132130.html