linux基础学习第十一天(shell循环、软件包管理)

2016-08-16

授课内容:

shell脚本基础:循环,for,while,until(未讲完)

软件包管理(未讲完):

软件运行环境

软件包基础

Rpm包管理

循环执行

将某代码段重复运行多次

重复运行多少次:

循环次数事先已知

循环次数事先未知

有进入条件和退出条件

循环控制语句:

break:【提结束循环,循环将不再执行】指前面的循环退出,退出后还继续执行后面的命令,而exit则是退出整个脚本

continue:【提结束本轮循环,而进入下一轮循环】当碰到continue语句时,continue后面的语句不再执行,直接提前进入下一轮循环

for循环

for 变量名in 列表;do

循环体

done

列表:以空格隔开的包括数字、字符、文件等个体

    执行机制:

     依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

    例如:

     写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和

 #!/bin/bash
 
 #Version:1.0
 #Create time:2016-08-15 13:51:02
 #Description:写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和
 let SUM=0
 read -p "input num: " NUM
 expr $NUM + 0 &> /dev/null
 [ $? -ne 0 ] && echo "please input digitnum" && exit 100
 [ $NUM -le 0 ] && echo "input the right num" && exit 99
 for I in `seq $NUM`
 do
     SUM=$(($SUM+$I))
 done
 echo "the sum is $SUM"
 unset SUM
 unset NUM

while循环:

while CONDITION; do

循环体

done

进入条件:CONDITION为true;

退出条件:CONDITION为false

即当循环体是真是执行循环体,循环体是假是退出循环体

例如:
求100以内所有正整数之和
#!/bin/bash
#Version:1.0
#Create time:2016-08-15 14:36:00
#Description:求100以内所有正整数之和
let SUM=0
let NUM=1
while [ $NUM -le 100 ] 
do
    SUM=$(($SUM+$NUM))
    NUM=$(($NUM+1))
done
echo "1+2+...+100=$SUM"
until循环
until CONDITION; do
循环体
done

进入条件:CONDITION 为false

退出条件:CONDITION 为true

【】即当循环体是真是执行循环体,循环体是假是退出循环体,与while循环相反

软件包管理

    软件运行环境

     程序源代码–> 预处理–> 编译–> 汇编–> 链接

     注释内容在预处理时被去掉

    ABI:Application Binary Interface

    Windows与Linux不兼容,如ls命令不能再windows运行,因为uwindows和linux的ABI接口不同

包管理器:

     二进制应用程序的组成部分:

          二进制文件、库文件、配置文件、帮助文件

     程序包管理器:

         debian:deb文件, dpkg包管理器

         redhat: rpm文件, rpm包管理器,SUSE系列也是使用rpm包管理器

         rpm: RedhatPackage Manager(初期)

         RPM Package Manager (行业标准,类似GNU)

     包命名

         源代码:name-VERSION.tar.gz|bz2|xz

         VERSION: major.minor.release

         rpm包命名方式:

         name-VERSION-release.arch.rpm

         例:bash-4.2.46-19.el7.x86_64.rpm

         VERSION: major.minor.release(即是源代码的命名方式)

         release:release.OS

         OS:el7,指的是RHEL7的版本

         常见的arch:

         x86: i386, i486, i586, i686(32位平台)

         x86_64: x64, x86_64, amd64(64位平台)

         powerpc: ppc

         跟平台无关:noarch

        包:一个rpm包里面包含多个文件

             Application-VERSION-ARCH.rpm: 主包

             Application-devel-VERSION-ARCH.rpm开发子包

             Application-utils-VERSION-ARHC.rpm其它子包

             Application-libs-VERSION-ARHC.rpm其它子包

    包之间:可能存在依赖关系,甚至循环依赖

    解决依赖包管理工具:

         yum:rpm包管理器的前端工具

         apt-get:deb包管理器前端工具

    

     由于一个二进制的执行程序包是由二进制文件、库文件、帮助文件和配置文件组成,所以每个包文件里包括:

     1、包文件组成(每个包独有)

         RPM包内的文件

         RPM的元数据,如名称,版本,依赖性,描述等

         安装或卸载时运行的脚本

     2、数据库(公共)

         程序包名称及版本

         依赖关系

         功能说明

         包安装后生成的各文件路径及校验码信息

    ldd:查看命令的库文件

[17:13 root@Centos7.2~]# ldd /usr/bin/ls
linux-vdso.so.1 =>  (0x00007ffe41576000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc41c3e6000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fc41c1e1000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fc41bfd7000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc41bc16000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc41b9b5000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fc41b78f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc41b58b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc41c61e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fc41b386000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc41b169000)

管理程序包的方式:

     后端包管理器:rpm

     使用前端工具:yum, dnf

rpm

    1、安装

         rpm {-i|–install} [install-options] PACKAGE_FILE…

         -v:显示详细情况

         -h:以#显示进度

         -ql:查询程序的所有文件及路径

         [install-options]:

         –test: 测试安装,但不真正执行安装;dry run模式

         –nodeps:忽略依赖关系

         –replacepkgs| replacefiles

         –nosignature: 不检查来源合法性

         –nodigest:不检查包完整性

         –noscipts:不执行程序包脚本片断

         %pre: 安装前脚本;–nopre

         %post: 安装后脚本;–nopost

         %preun: 卸载前脚本;–nopreun

         %postun: 卸载后脚本;–nopostun

    2、升级

         rpm {-U|–upgrade} [install-options] PACKAGE_FILE…

          rpm {-F|–freshen} [install-options] PACKAGE_FILE…

         upgrade:安装有旧版程序包,则“升级”

         如果不存在旧版程序包,则“安装”

         freshen:安装有旧版程序包,则“升级”

         如果不存在旧版程序包,则不执行升级操作

         rpm -Uvh PACKAGE_FILE …

         rpm -Fvh PACKAGE_FILE …

         –oldpackage:降级

         –force: 强行升级

课后作业:

一、用until实现下列作业

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 09:53:04
#Description:每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户nihaoma登录,则将登录时间和主机记录于日志/var/log/login.log中,    并提示该用户退出系统。
until who|grep "nihaoma" &> /dev/null
do
    sleep 3
done
echo `who|grep 'nihaoma' |tr -s ' ' ':'|cut -d: -f3-6` >> /var/log/login.log &> /dev/null
mail -s "please logout" nihaoma &> /dev/null

2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 10:24:52
#Description:随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
NUM=$(($RANDOM%11))
read -p "input a NUM: " NUM1
! expr $NUM1 + 1 &> /dev/null && echo "please input a num." && exit 100
until [ $NUM1 -eq $NUM ]
do
    [ $NUM1 -lt $NUM ] && echo "litter" || echo "bigger"
    read -p "input a NUM: " NUM1
    until  expr $NUM1 + 1 &> /dev/null 
    do
        echo "please input a num." 
        read -p "input a NUM: " NUM1
    done
done
echo "yes the NUM is $NUM"

3、编写脚本,求100以内所有正整数之和

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 10:48:15
#Description:编写脚本,求100以内所有正整数之和
let I=0
let SUM=0
until [ $I -gt 100 ]
do
    SUM=$(($I+$SUM))
    I=$(($I+1))
done
echo "the sum is $SUM"

4、编写脚本,通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。

let NUM=1
COUNT1=0
COUNT2=0
until [ $NUM -gt 254 ]
do
    ping -c1 -W1 "172.16.250.$NUM" &> /dev/null
    if [ $? -eq 0 ];then
        echo "172.16.150.$NUM is up"
        COUNT1=$(($count1+1))
    else
        COUNT2=$(($COUNT2+1))
    fi
    NUM=$(($NUM+1))
done
    echo "total $COUNT1 is up,$COUNT2 is down"
unset NUM
unset COUNT1
unset COUNT2

5、编写脚本,打印九九乘法表

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:07:26
#Description:
NUM=1
until [ $NUM -gt 9 ]
do
    for I in `seq $NUM`
    do
        echo -ne "${NUM}X$I=$(($NUM*$I))\t"
    done
    NUM=$(($NUM+1))
    echo
done
unset NU

6、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:08:42
#Description:
let I=1
let MAX=0
let MIN=$RANDOM
echo $MIN
until [ $I -gt 9 ]
do
    let NUM=$RANDOM
    echo "$NUM"
    if [ $NUM -le $MAX ];then
        if [ $NUM -le $MIN ];then
            MIN=$NUM
        fi
    else
        MAX=$NUM
    fi
    I=$(($I+1))
done
echo "the max num is $MAX"
echo "the min num is $MIN"
unset I
unset MAX
unset MIN
unset NUM

7、编写脚本,实现打印国际象棋棋盘

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:10:07
#Description:
#算法:行数和列数之和为偶数打印白格,为奇数打印黑格
let I=1
until [ $I -gt 8 ]
do
    for J in `seq 8`
    do
        [ $((($I+$J)%2)) -eq 0 ] && echo -ne "\033[47m  \033[0m" || echo -ne "\033[40m  \033[0m"
    done
    I=$(($I+1))
    echo
done

8、打印等腰三角形

#!/bin/bash
#Version:1.0
#Create time:2016-08-17 11:21:00
#Description:打印等腰三角形,
#算法:1、第n行打印总行数N-n个空格,2、第n行打印2n-1个*。先打印空格再打印*
read -p "how many lines you want? " LINES
! expr $LINES + 0 &> /dev/null && echo "input digitNUM" && exit 100
[ $LINES -le 0 ] && echo "input positive int" && exit 99
let I=1
let B=$LINES-1
until [ $I -gt $LINES ]
do
    for A in `seq $B`
    do
        echo -n " "
    done
    let B--
    for J in `seq $((2*$I-1))`
    do
        echo -n "*"
    done
    echo
    let I++
done

9、安装centos6.7,用centos6.8kernel升级

rpm -ivh kernel-2.6.32-431.el6.x86_64.rpm

二、预习

原创文章,作者:麦德良,如若转载,请注明出处:http://www.178linux.com/36947

(0)
麦德良麦德良
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相关推荐

  • LVS_DR配置

    DR : 192.168.29.150 VIP:192.168.29.100 RS1: 192.168.29.110 VIP:192.168.29.100 RS2:192.168.29.120 VIP:192.168.29.100 RS 配置 1 配置VIP [root@local ~]# ifconfig lo:0 192.168.29.100 netma…

    2017-06-30
  • IP地址与网络配置方式

    IP 地址 它们可唯一标识IP网络中的每台设备 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址 IP地址由两部分组成: (总共32位) 网络ID: 标识网络 每个网段分配一个网络ID 主机 ID: 标识单个主机 由组织分配给各设备   IP 地址分类 32位IP=网络ID+主机ID A 类: 前8位是网络ID位,后24位是主机ID位 00…

    2017-05-07
  • 救援模式安装RPM

    救援模式安装RPM 步骤如下: (1)先让RPM“自杀”掉,必须要使用忽略依赖选项—nodeps,否则卸载不了RPM程序。 (2)卸载完成后,将机器重启,按F2键进入机器的BIOS模式,如下图选择CD-ROM启动,最后按F10保存退出。 (3)机器将会从光驱上使用光盘文件做引导启动,如下图界面,相信大家都非常熟悉,该界面在我们安装新系统的时候,也会见到。啰嗦…

    Linux干货 2016-08-26
  • Linux文件三剑客sed命令用法详解

    sed是一种流编辑器,它是文本处理中非常强大的工具,能够完美的配合正则表达式使用,用法简单实用,非常灵活。        工作原理:sed命令处理文本时,把当前处理的行存储在一个临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。 在…

    2017-06-24
  • CentOS 系统自动化安装

    CentOS 系统自动化安装 概述:     系统安装过程     配置anaconda     自动化安装系统 CentOS 系统安装: 1.启动流程: bootloader–>kernel(initrd)–>rootfs–>anaconda(…

    Linux干货 2016-09-21
  • 文本查找与文件查找

    咬文嚼字,颠倒糊涂,善哉!善哉? 念头通达,思虑有感,言简明,意通神 文件是什么?文本是什么?文本文件是什么?      好想来碗正常的豆腐脑,可惜每天早上也只能是豆腐花。吃不到,想想还是可以的,豆腐脑是“文件”,吃豆腐脑是“看文本”,找到地,点了豆腐脑,就是“查找文件”,符合个人口味的,加盐,加咸菜,加黄豆…

    2017-06-04

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 10:02

    脚本需要我们做的就是多写,多看优秀的代码,rpm包管理器常用的选项需要做的就是能熟练允许用,这需要多加联系。