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