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、通过脚本参数传递一个目录给脚本,而后计算此目录下所有文本文件的行数之和,并说明此类文件的总数

原文地址:https://www.cnblogs.com/Presley-lpc/p/12370025.html