zoukankan      html  css  js  c++  java
  • Linux学习41 yum实战进阶及shell脚本实现磁盘管理实战

    一、概述

      1、桌面环境:

        Windows7,OpenSUSE 13.2,Kubuntu(KDE)

      2、yum安装回顾

        a、yum程序包管理器

          C/S:

            yum client(yum)

            yum repository(ftp/http/https)

            

            

            base:主包

            extras:额外的包

            updates:升级包

          repo定义

            [id]

            name=

            baseurl=http://

                http://

        b、子命令

          list,clean,makecache,grouplist,whatprovides

          install,update,remove,groupinstall,groupupdate,groupremove,groupinfo

          yum install /usr/local/src/testapp-3.3.1-1.el7.x86_64.rpm #通过这种方式安装此rpm包,当安装此rpm包需要依赖其它安装包时,若yum仓库存在的话他会自动解决依赖关系安装相应的依赖包。但是如果通过rpm -ivh安装此rpm包的话就不能自动解决。

      3、编译安装回顾

        a、C/C++:

          ./configure --> Makefile.in ==> makefile

          make + makefile ==> binary,library,configfile,manual

          make install

    二、bash脚本编程

      1、过程式编程语言的执行流程

        顺序执行

        选择执行

        循环执行

      2、选择执行:

        (1)、&&,||

        (2)、if语句

        (3)、case语句

      3、if语句:三种格式-

        a、单分支的if语句

          if CONDITION;then

            if-true-分支

          fi

        b、双分支的if语句

          if CONDITIOON;then

            if-true-分支

          else

            if-false-分支

          fi

        c、多分枝的if语句

          if CONDITION1;then

            条件1为真分支

          elif CONDITION2;then

            条件2为真分支

          elif CONDITION3;then

            条件3为真分支

          ...

          elif CONDITIONn;then

            条件n为真分支

          else

            所有条件均不满足时的分支

          fi

          注意:即便多个条件可能同时都能满足,分支只会执行其中一个,首先测试为“真”。

          示例:脚本参数传递一个文件路径给脚本,判断此文件的类型。

    [root@localhost script]# cat filetype.sh 
    #!/bin/bash
    if [ $# -lt 1 ];then
        echo "At least one path"
        exit 1
    fi
    
    if ! [ -e "$1" ];then
        echo "No such file"
        exit 2
    fi
    
    if [ -f $1 ];then
        echo "Common file"
    elif [ -d $1 ];then
        echo "Directory"
    elif [ -L $1 ];then #是否存在并且为符号链接
        echo "Symbolic link" 
    elif [-b $1 ];then
        echo "block special file"
    elif [ -c $1 ];then
        echo "character special file"
    elif [ -S $1 ];then 
        echo "Socket file"
    else
        echo "Unkown"
    
    fi
    [root@localhost script]# bash -n filetype.sh 
    [root@localhost script]# bash -x filetype.sh /etc/
    + '[' 1 -lt 1 ']'
    + '[' -e /etc/ ']'
    + '[' -f /etc/ ']'
    + '[' -d /etc/ ']'
    + echo Directory
    Directory

        d、注意:if语句可嵌套

        e、练习:写一个脚本

          (1)、传递一个参数给脚本,此参数为用户名

          (2)、根据其ID号来判断用户类型

            0:管理员

            1-999:系统用户

            1000+:登陆用户

    [root@localhost script]# cat usertype.sh 
    #!/bin/bash
    [ $# -lt 1 ] && echo "At least on user name." && exit 1
    
    ! id $1 &> /dev/null && echo "No such user." && exit 2
    
    userid=$(id -u $1)
    
    if [ $userid -eq 0 ];then
        echo "root"
    elif [ $userid -ge 1000 ];then
        echo "login user."
    else
        echo "System user."
    fi
    [root@localhost script]# bash -n usertype.sh 
    [root@localhost script]# bash -x usertype.sh 
    + '[' 0 -lt 1 ']'
    + echo 'At least on user name.'
    At least on user name.
    + exit 1
    [root@localhost script]# bash -x usertype.sh root
    + '[' 1 -lt 1 ']'
    + id root
    ++ id -u root
    + userid=0
    + '[' 0 -eq 0 ']'
    + echo root
    root

        f、练习:写一个脚本

          (1)、列出如下菜单给用户

              disk)show disks info

              mem) show memory info

              cpu) show cpu info

                cat /proc/cpuinfo或lscpu命令即可

              *) quit

          (2)、提示用户给出自己的选择,而后显示对应其选择的相应系统信息

    [root@localhost script]# cat sysinfo.sh 
    #!/bin/bash
    cat <<EOF
    disk) show disks info
    mem) show memory info
    cpu) show cpu info
    *) QUIT
    EOF
    read -p "Your choice: " option
    if [[ "$option" == "disk" ]];then
        fdisk -l /dev/[sh]d[a-z]
    elif [[ "$option" == "mem" ]];then 
        free -m
    elif [[ "$option" == "cpu" ]];then
        lscpu
    else
        echo "Unkown option."
        exit3
    fi
    [root@localhost script]# bash sysinfo.sh 
    disk) show disks info
    mem) show memory info
    cpu) show cpu info
    *) QUIT
    Your choice: mem    
                  total        used        free      shared  buff/cache   available
    Mem:           1991         145        1031           9         815        1606
    Swap:          2047           0        2047
    [root@localhost script]# 

    三、循环执行

      1、将一段代码重复执行0,1或多次

        进入条件:条件满足时才进入循环

        退出条件:每个循环都应该有退出条件,以有机会退出循环;

      2、bash脚本有三种方式

        for循环

        while循环

        until循环

      3、for循环

        a、两种格式

          (1)、遍历列表

            列表的生成方式:

              1)、直接给出

              2)、整数列表

                i、{start..end}

                ii、seq   

                  seq [OPTION]... LAST:比如seq 3 就表示输出1,2,3三个数

                  seq [OPTION]... FIRST LAST:比如seq 1 5就表示输出1到5
                  seq [OPTION]... FIRST INCREMENT LAST:比如seq 1 2 11  就表示1到11步长为2输出,即每次加2输出

    [root@localhost script]# seq 1 2 11
    1
    3
    5
    7
    9
    11

              3)、返回列表的命令,比如 ls /var或cat /etc/issue等,返回值相当于也是列表

              4)、glob,比如 ls /etc/p*

              5)、变量引用

                $@,$*

          (2)、控制变量

        b、遍历列表

          for VARAIBLE in LIST;do

            循环体

          done

          进入条件:只要列表有可用元素,即可进入循环。

          退出条件:列表中的元素遍历完成。

          示例1:批量添加用户

    [root@localhost script]# cat useradd3.sh 
    #!/bin/bash
    for username in user21 user22 user23;do
        useradd $username
    done
    
    [root@localhost script]# bash -x useradd3.sh 
    + for username in user21 user22 user23
    + useradd user21
    + for username in user21 user22 user23
    + useradd user22
    + for username in user21 user22 user23
    + useradd user23
    [root@localhost script]# 
    [root@localhost script]# cat useradd3.sh 
    #!/bin/bash
    for username in user21 user22 user23;do
        if id $username &> /dev/null;then
            echo "$username exists."    
        else
            useradd $username && echo "Add user $username finished." 
        fi
    done

          示例2:在/tmp目录下添加10个临时文件

    [root@localhost script]# cat addfile.sh 
    #!/bin/bash
    for filename in $(seq 1 10);do
        touch /tmp/f$filename
    done
    [root@localhost script]# bash -x addfile.sh 
    ++ seq 1 10
    + for filename in '$(seq 1 10)'
    + touch /tmp/f1
    + for filename in '$(seq 1 10)'
    + touch /tmp/f2
    + for filename in '$(seq 1 10)'
    + touch /tmp/f3
    + for filename in '$(seq 1 10)'
    + touch /tmp/f4
    + for filename in '$(seq 1 10)'
    + touch /tmp/f5
    + for filename in '$(seq 1 10)'
    + touch /tmp/f6
    + for filename in '$(seq 1 10)'
    + touch /tmp/f7
    + for filename in '$(seq 1 10)'
    + touch /tmp/f8
    + for filename in '$(seq 1 10)'
    + touch /tmp/f9
    + for filename in '$(seq 1 10)'
    + touch /tmp/f10

          示例3:求100以内所有正整数之和

    [root@localhost script]# cat sum2.sh 
    #!/bin/bash
    declare -i sum=0
    for i in {1..100};do 
        sum=$[ $sum+$i ]
    done
    echo $sum
    [root@localhost script]# bash sum2.sh 
    5050

          示例4:判断/var/log下的每一个文件的内容类型

    [root@localhost script]# cat filetype2.sh 
    #!/bin/bash
    for filename in /var/log/*;do
    if [ -f $filename ];then
        echo "Common file"
    elif [ -d $filename ];then
        echo "Directory"
    elif [ -L $filename ];then #是否存在并且为符号链接
        echo "Symbolic link" 
    elif [-b $filename ];then
        echo "block special file"
    elif [ -c $filename ];then
        echo "character special file"
    elif [ -S $filename ];then 
        echo "Socket file"
    else
        echo "Unkown"
    
    fi
    done

    四、练习

      1、分别求100以内所有偶数之和,以及所有奇数之和

      2、计算当前系统上的所有用户id之和

      3、通过脚本参数传递一个目录给脚本,而后计算此目录下所有文本文件的行数之和,并说明此类文件的总数

  • 相关阅读:
    十三、Sleuth分布式请求链路追踪
    十二、SpringCloud Stream消息驱动
    十一、SpringCloud Bus 消息总线
    Linux命令(权限管理)
    Linux命令(文件管理)
    Linux的文件和目录
    Linux介绍及安装
    Docker
    Nginx
    13、SpringBoot整合Mybatis-Plus
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12370025.html
Copyright © 2011-2022 走看看