• 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
  • 相关阅读:
    [leetcode] Bulls and Cows
    Win7 系统所有应用颜色调整
    一道题反映Java的类初始化过程
    翻转二叉树(深搜-先序遍历-交换Node)
    在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
    一道随机函数题:由rand5()生成rand7()
    求一条直线通过的最大点数
    菜根谭#236
    菜根谭#235
    菜根谭#234
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12132130.html
Copyright © 2020-2023  润新知