一、循环语句: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)
上一篇 2016-08-19 11:50
下一篇 2016-08-19 15:17

相关推荐

  • centos 6系统启动流程分析

    linux 系统启动流程: 之前有描述过linux的启动流程,但还有许多模糊的地方,经过一段时间了学习,查资料,看脚本,比初次理解更深,可以将上次模糊或不足的地方描述得比较清楚一些。 先看一张启动流程图。   分析: linux系统的启动流程大概可以分为两大部分: 第一部分为内核空间的启动 第二部分为用户空间的启动 其中,内核空间的启动主要可为分四…

    2017-05-15
  • Apache通过mod_proxy模块连接Tomcat并使用Memcached+MSM做Tomcat会话保持

    一 实验目的 本实验使用Apache的mod_proxy模块连接Tomcat, Nginx在前端做负载均衡,并使用Memcahced+MSM的方式保持Tomcat的会话,实现会话共享。 二 实验拓扑 说明:为测试方便,Memcached与Tomcat安装在同一机器中,正式环境应该安装在不同机器中。 三 实验环境 主机 IP 安装组件 node1 192.16…

    Linux干货 2017-01-17
  • httpd 2.2(Apache Web服务器)

    apache (Web服务器) 简介: Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。    Apache HTTP服务器是一个模块化的服…

    Linux干货 2016-03-30
  • 初识MySQL(一)

        数据库(DATABASES)      数据库是一个单位或是一个应用领域的通用数据处理系统,存储有企业和事业部门、团体和个人的有关数据的集合,该集合中数据是从全局观点出发建立的,按一定的数据模型进行组织、描述和存储。其结构基于数据间的自然联系,从而可提供一切必要的存取路径,且数据不…

    Linux干货 2015-08-24
  • 第一周作业

    一、描述计算机的组成及其功能 计算机是由处运算器,控制器,储存器,输入输出设备组成 运算器:执行各种计算和逻辑运算操作 控制器:完成协调和指挥整个计算机系统的操作 储存器:暂时存储或者长期存储数据 输入设备:向计算机输入数据和信息的设备 输出设备:计算机硬件系统的终端设备 二、按系列罗列Linux的发行版,并描述不同发行版之间的联系和区别 Linux发行版=…

    Linux干货 2016-12-05
  • 权限管理

    权限管理 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。 我们先来看看文件的属性: 权限: r:可获取文件数据(读取文件) w:可修改文件的数据(写入数据) x:可以把此文件提请内核启动为一个进程 (执行) 文件的权限主要针对三类对象进行定义:  owner: 属主, u  grou…

    Linux干货 2016-08-05