一、循环语句:for, while, until

循环执行:
将某代码段重复运行多次
重复运行多少次:
循环次数事先已知
循环次数事先未知
有进入条件和退出条件

1.for……do……done

for 变量 in 列表 ; do
    循环体
done

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

列表生成方式:
(1) 直接给出列表
(2) 整数列表
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 返回列表的命令:$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用:$@, $*

2.while……do……done

while CONDITION ; do
    循环体
done

CONDITION:循环控制条件
进入循环之前,先做一次判断;
每一次循环之后会再次做判断;
条件为“true”,则执行一次循环;
直到条件测试状态为“false”终止循环.

因此:
CONDTION一般应该有循环控制变量;
而此变量的值会在循环体不断地被修正;
进入条件:CONDITION为true;
退出条件:CONDITION为false.

3.until……do……done

until CONDITION ; do
    循环体
done

CONDITION:循环控制条件
进入循环之前,先做一次判断;
每一次循环之后会再次做判断;
条件为“false”,则执行一次循环;
直到条件测试状态为“true”终止循环.

因此:
CONDTION一般应该有循环控制变量;
而此变量的值会在循环体不断地被修正;

进入条件:CONDITION 为false
退出条件:CONDITION 为true

4.循环控制语句:continue, break

(1).continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

while CONDTIITON1 ; do
    CMD1
    …
    if CONDITION2 ; then
        continue
    fi
    CMDn
    …
done

(2).break [N]:提前结束第N层循环,最内层为第1层

while CONDTIITON1; do
    CMD1
    …
    if CONDITION2; then
        break
    fi
    CMDn
    …
done

5.创建无限循环

while true ; do
    循环体
done

until false ; do
    循环体
Done

二、程序包管理:rpm

1.程序基础

API:Application Programming Interface
POSIX:Portable OS
源代码编译:程序源代码–> 预处理–> 编译–> 汇编–> 链接
静态编译:.a
共享编译:.so

ABI:Application Binary Interface
Windows与Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
库级别的虚拟化:
Linux: WINE
Windows: Cywin

系统级开发:C, C++
应用级开发:java, delphi, Python, go, php, perl, ruby

2.包管理器

二进制应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件

程序包管理器分类:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: RPM Package Manager (Redhat Package Manager)

3.程序包命名

源代码: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
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64powerpc: ppc
跟平台无关:noarch

4.程序包:分类和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm开发子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
程序包之间:可能存在依赖关系,甚至循环依赖

解决依赖包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具

5.库文件
ldd /PATH/TO/BINARY_FILE :查看二进制程序所依赖的库文件:
ldconfig -p : 显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache

6.程序包管理器:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

包文件组成(每个包独有):RPM包内的文件;RPM的元数据,如名称,版本,依赖性,描述等;安装或卸载时运行的脚本
数据库(公共):程序包名称及版本;依赖关系;功能说明;包安装后生成的各文件路径及校验码信息

管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf

获取程序包的途径:

(1) 系统发版的光盘或官方的服务器;
CentOS镜像:https://www.centos.org/download/
国内镜像站点:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

(2) 项目官方站点

(3) 第三方组织:
Fedora-EPEL: Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

(4) 自己制作
注意:检查其合法性:来源合法性,程序包的完整性

7.rpm包管理

CentOS系统上使用rpm命令管理程序包:安装、卸载、升级、查询、校验、数据库维护

(1).安装:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: 查看安装过程中的详细信息
-vv:查看安装过程中更详细信息
-h: 以#显示程序包管理执行进度
常用选项:rpm -ivh PACKAGE_FILE …

–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:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作
–oldpackage:降级
–force: 强行升级
常用选项:rpm -Uvh PACKAGE_FILE …
常用选项:rpm -Fvh PACKAGE_FILE …

注意:
(1)不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
(2)果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

用for实现
1、判断/var/目录下所有文件的类型

     #!/bin/bash
     #date:08/16/16
     read -p "Please input a directory:" dir
     test ! -d $dir && echo "Sorry,it is not a directory" && exit
     echo "$dir" | grep -o "\/$" > /dev/null || dir=$dir/
     echo
     for file in `ls -A $dir` ; do
         file $dir$file
     done

2、添加10个用户user1-user10,密码同用户名

     #!/bin/bash
     #date:08/16/16
     for id in `echo {1..10}` ; do
         useradd user$id ; echo "user$id:user$id" | chpasswd
     done

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S开头
     的文件输出为文件名加start;“K34filename stop”,“S66filename start”

     #!/bin/bash
     #date:08/16/16
     for file in `ls -A /etc/rc.d/rc3.d` ; do
         case $file in 
         K*)
             echo "$file stop"
             ;;
         S*)
             echo "$file start"
             ;;
         *)
             echo "$file is not begin with K or S"
         esac
     done

4、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和     #!/bin/bash

     #date:08/16/16    
     read -p "Please input a integer:" int
     if expr $int + 0 > /dev/null ; then
         
         for num in  `seq $int` ; do
             num=$[num+int]
         done
         echo "The sum is $num"
     else
         echo "$int is not a integer"
     fi

5、写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态     #!/bin/bash

     #date:08/17/16
     read -p "Please input a IP addr:" netip
     if echo "$netip" | egrep -q '\<(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])(\.(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])){3}\>' ; then
        firstnum=`echo "netip" | cut -d "." -f 1`
         if [ $firstnum -gt 0 -a $firstnum -lt 127 ] ; then
             for tail in {0..255}.{0..255}.{0..255} ; do
                 ping -c 1 -W 1 $firstnum.$tail &> /dev/null && echo "$firstnum.$tail is up" || echo "$firstnum.$tail is down"
             done
         elif [ $firstnum -ge 128 -a $firstnum -le 191 ] ; then
             head=`echo "$netip" | cut -d "." -f 1,2`
             for tail in {0..255}.{0..255} ; do
                 ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down"
             done
         elif [ $firstnum -ge 192 -a $firstnum -le 233 ] ; then
             head=`echo "$netip" | cut -d "." -f 1,2,3`
             for tail in {0..255} ; do
                 ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down"
             done
         else
             echo "This ip can not connect internet"
         fi
     else
         echo "This is a illegal IP"
     fi

6、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     for i in {1..9} ; do
        for j in `seq $i` ; do
            echo -ne "$j*$i=$[i*j]\t"
        done
        echo
     done

用while实现

1、求100以内所有正整数之和

     #!/bin/bash
     #date:08/17/16
     i=0
     while [ $i -le 100 ] ; do
         j=$[j+i] ; let i++
     done
     echo $j

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

     #!/bin/bash
     #date:08/17/16
     i=1
     while [ $i -le 254 ] ; do
         if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then
            echo "172.16.250.$i is up" ; let up++
        else
            echo "172.16.250.$i is down" ; let down++
        fi
        let i++
     done
     echo "The sum of up is $up"
     echo "The sum of down is $down"

3、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     i=1
     while [ $i -le 9 ] ; do
        j=1
               while [ $j -le $i ] ; do
                echo -ne "$j*$i=$[i*j]\t" ; let j++
            done
        echo
        let i++
     done

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

     #!/bin/bash
     #date:08/17/16
     num=`echo $[RANDOM]`
     echo=$num
     max=$num
     min=$num
     i=1
     while [ $i -le 9 ] ; do
         num=`echo $[RANDOM]`
         echo $num
         [ $num -gt $max ] && max=$num 
         [ $num -lt $min ] && min=$num
         let i++
     done
     echo "max $max"
     echo "min $min"

5、打印国际象棋棋盘

     #!/bin/bash
     #date:08/17/16
     i=1
      while [ $i -le 8 ] ; do
 
     j=1
          while [ $j -le 8 ] ; do
        sum=$[$i+$j]
        rem=$[$sum%2]
             if [ $rem -eq 0 ] ; then
                echo -ne "\033[47m  \033[0m"
                else
                   echo -ne "\033[41m  \033[0m"
            fi
              j=$[$j+1]
            done
    i=$[$i+1]
    echo
    done

用until实现
  1、求100以内所有正整数之和

     #!/bin/bash
     #date:08/17/16
     i=0
     until [ $i -gt 100 ] ; do
         j=$[j+i] ; let i++
     done
     echo $j

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

     #!/bin/bash
     #date:08/17/16
     i=1
     until [ $i -gt 254 ] ; do
         if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then
            echo "172.16.250.$i is up" ; let up++
        else
            echo "172.16.250.$i is down" ; let down++
        fi
        let i++
     done
     echo "The sum of up is $up"
     echo "The sum of down is $down"

3、打印九九乘法表

     #!/bin/bash
     #date:08/17/16
     i=1
     until [ $i -gt 9 ] ; do
        j=1
               until [ $j -gt $i ] ; do
                echo -ne "$j*$i=$[i*j]\t" ; let j++
            done
        echo
        let i++
     done

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

     #!/bin/bash
     #date:08/17/16
     num=`echo $[RANDOM]`
     echo=$num
     max=$num
     min=$num
     i=1
     until [ $i -gt 9 ] ; do
         num=`echo $[RANDOM]`
         echo $num
         [ $num -gt $max ] && max=$num 
         [ $num -lt $min ] && min=$num
         let i++
     done
     echo "max $max"
     echo "min $min"

5、打印国际象棋棋盘

     #!/bin/bash
     #date:08/17/16
     i=1
      until [ $i -gt 8 ] ; do
 
     j=1
      until [ $j -gt 8 ] ; do
        sum=$[$i+$j]
        rem=$[sum%2]
         if [ $rem -eq 0 ] ; then
            echo -ne "\033[47m  \033[0m"
        else
            echo -ne "\033[41m  \033[0m"
        fi
          j=$((j+1))
    done
    i=$((i+1))
    echo
done

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

     #!/bin/bash
     #date:08/17/16
     until false ; do
         if who | grep -q "^hacker\>"  ; then
             break
         fi 
         sleep 3
     done
     echo "`date +%F +%T` hacker logged on" >> /var/log/login.log
     ##!/bin/bash
     # 
     #until who | grep -q "^hacker\>" ; do 
     #    sleep 3
     #done
     #echo "`date +%F +%T` hacker logged on" >> /var/log/login.log

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

         #!/bin/bash
         r=$[RANDOM%10]
         n=11
         until [ $n -eq $r ]  ; do
             read -p "please inout a numper (0-9) " n
                if [ $n -eq $r ] ; then
                    echo "it is right"
                elif [ $n -gt $r ] ; then
                    echo "it is great"
                else [ $n -lt $r ]
                    echo "it is less"
                fi
         done

  8、打印等腰三角形

  #!/bin/bash
  read -p "number:" n
  for ((i=0;i<=$n;i++)) ; do
      for ((j=$n;j>i;j--)) ; do
          echo -n " "
      done
      for((j=0;j<2*i-1;j++))
          echo -n "*"
      done
      echo
  done

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

(0)
anonymousanonymous
上一篇 2016-08-19
下一篇 2016-08-19

相关推荐

  • 马哥教育网络班22期+第二周课程练习

    week2作业: 1.linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 (1)touch 功能:创建文件 示例:  [root@director1 example]# touch file1 file2 [root@director1 example]# ll to…

    Linux干货 2016-08-22
  • ansible基础应用

    Ansible基础 ansible是一款自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。 Ansible架构简介 ansible的核心就是ansible平台,ansible是高度模…

    Linux干货 2016-08-22
  • 第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who user1    tty1         2016-12-27&nb…

    Linux干货 2016-12-28
  • N22-第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ~]# cp -r /etc/skel /home/tuser1 ~]# chmod -R go= /home/tuser1/ 2、编辑/etc…

    Linux干货 2016-09-06
  • centos系统启动流程详解

    centos系统启动流程详解 CentOS启动流程: POST 加电自检 主板上有一个ROM芯片,有只读程序,CPU被设计为一旦通电就会自动去找ROM芯片上的程序并运行,即检查各种硬件设备是否存在。 BootSequence 引导过程 加电自检后按BIOS中设定的次序查找各引导设备,第一个有引导程序的设备即是本次启动用到的设备 MBR(BootLoader)…

    Linux干货 2017-09-04
  • suid, sgid, sticky简介

    SUID属性 passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码。但是保存用户密码的/etc/shadow文件的权限是000,也就是说只有文件的所有者root用户可以写入,那为什么其他用户也可以修改自己的密码呢?这就是由于Linux的文件系统中的文件有SUID属性。 [root@centos6 ~]# ll /etc/shadow…

    Linux干货 2017-07-27