shell 脚本 之循环 for while until 和 软件包的管理 【上】

shell 脚本 之循环 for while until 和 软件包的管理 【上】

循环执行 

   将某代码段重复运行多次 

   重复运行多少次: 

           循环次数事先已知 

           循环次数事先未知 

       有进入条件和退出条件 

for, while, until

for 变量名 in 列表;do 

        循环体 

     done  

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

列表生成方式: 

    (1) 直接给出列表 

    (2) 整数列表: (a) {start..end} (b) $(seq [start [step]] end) 

    (3) 返回列表的命令 $(COMMAND) 

    (4) 使用glob,如:*.sh 

    (5) 变量引用; $@, $*

while循环 

while CONDITION; do 

       循环体 

    done 

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

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

进入条件:CONDITION为true;  

退出条件:CONDITION为false

until循环 until CONDITION; do 

      循环体 

done

 进入条件: CONDITION 为false  

   退出条件: CONDITION 为true

循环控制语句 之 continue and break

循环控制语句continue

 用于循环体中 

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

    while CONDTIITON1; do 

       CMD1 

       … 

    if CONDITION2; then 

       continue 

    fi 

       CMDn 

       … 

    done

    循环控制语句break

 用于循环体中 

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

    while CONDTIITON1; do 

       CMD1 

       … 

    if CONDITION2; then 

       break 

    fi CMDn 

       … 

    done

    创建无限循环

while true; do 

    循环体 

done

until false; do 

    循环体 

Done

解压归档 之 tar

tar [OPTION]… 

(1) 创建归档 

    tar -c -f /PATH/TO/SOMEFILE.tar FILE… 

    tar cf /PATH/TO/SOMEFILE.tar FILE… 

(2) 查看归档文件中的文件列表  

    tar -t -f /PATH/TO/SOMEFILE.tar 

(3) 展开归档 

    tar -x -f /PATH/TO/SOMEFILE.tar tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/  

    结合压缩工具实现:归档并压缩 -j: bzip2, -z: gzip, -J: xz

cpio 复制 从或到文件 

    cpio命令是通过重定向的方式将文件进行打包备份,还原恢复 的工具,它可以解压以“.cpio”或者“.tar”结尾的文件。 

    cpio [选项] > 文件名或者设备名 

    cpio [选项] < 文件名或者设备名  

    选项 

      -o 将文件拷贝打包成文件或者将文件输出到设备上 

      -i 解包,将打包文件解压或将设备上的备份还原到系统 

      -t 预览,查看文件内容或者输出到设备上的文件内容 

      -v 显示打包过程中的文件名称。

      -d 解包生成目录,在cpio还原时,自动的建立目录 

      -c 一种较新的存储方式

      例如

      将etc目录备份: 

         find ./etc -print |cpio -ov >etc.cpio  

      内容预览 

         cpio –tv < etc.cpio  

      要解包文件 

         cpio –iv  <etc.cpio 

         cpio –idv < etc.cpio

软件运行环境

API:Application Programming Interface 

        POSIX:Portable OS  

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

        静态编译: 

        共享编译:.so 

  ABI:Application Binary Interface 

        Windows与Linux不兼容 

        ELF(Executable and Linkable Format) 

        PE(Portable Executable) 

    库级别的虚拟化: 

        Linux: WINE 

        Windows: Cywin

包管理器

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

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

程序包管理器: 

    debian:deb文件, dpkg包管理器 

    redhat: rpm文件, rpm包管理器 

    rpm: Redhat Package Manager 

         RPM  Package Manager

   包命名

rpm包命名方式: 

   name-VERSION-release.arch.rpm 

   VERSION: 

   major.

   minor.

   release 

   release:release.OS 

   常见的arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64 

   powerpc: ppc 

   跟平台无关:noarch

   包命名和工具

包:分类和拆包 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包管理器前端管理工具

库文件

查看二进制程序所依赖的库文件: 

   ldd /PATH/TO/BINARY_FILE  

管理及查看本机装载的库文件: 

   ldconfig 

   /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件 

名及文件路径映射关系 

   配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 

   缓存文件:/etc/ld.so.cache

   包管理器

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

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

    RPM包内的文件 

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

    安装或卸载时运行的脚本 

2、数据库(公共) 

    程序包名称及版本 

    依赖关系 

    功能说明 

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

管理程序包的方式: 

    使用包管理器:

    rpm 

    使用前端工具:

    yum, dnf 

rpm包管理 

   CentOS系统上使用rpm命令管理程序包: 

     安装、卸载、升级、查询、校验、数据库维护 

     安装: 

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

        -v: verbose 

        -vv: 

        -h: 以#显示程序包管理执行进度 

     rpm -ivh PACKAGE_FILE …

rpm包安装 [install-options] 

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

    –nodeps:忽略依赖关系 

    –replacepkgs | replacefiles 

    –nosignature: 不检查来源合法性 

    –nodigest:不检查包完整性 

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

    

    %pre: 安装前脚本; –nopre 

    %post: 安装后脚本; –nopost 

    %preun: 卸载前脚本; –nopreun 

    %postun: 卸载后脚本;–nopostun

rpm包升级

 升级: 

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: 强行升级

升级注意事项

  (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此 ,对直接安装新版本内核 

    (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本 

        的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而 把新版本的文件重命名(FILENAME.rpmnew)后保留

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

#!/bin/bash

 read -p "first number:" a

 read -p "second number:" b

[ $a -ge $b ] && echo "sum is `seq -s+ $b $a | bc`" || echo "sum is `seq -s+ $a $b | bc`"

[root@localhost bin]# bash shushu.sh

first name is a:2

second name is b:100

sum= 5049

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

#!/bin/bash

 read -p "please input a IPv4:" ip

  up=0 down=0

  ipv4=`echo $ip|cut -d. -f1-3`

 for ipv in {0..255} ;do

   IP="$ipv4"."$ipv"

   ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null

 done

 echo "IPv4($ipv4.1-255) up is :$up"

 echo "IPv4($ipv4.1-255) down is :$down"

3、打印九九乘法表 

for i in  {1..9};do

for j in $(seq 1 $i) ;do

     echo -ne "${j}x${i}=$[i*j]\t"

done

echo 

done

电脑演示

[root@localhost bin]# vim 999.sh

[root@localhost bin]# bash 999.sh

1×1=1

1×2=2 2×2=4

1×3=3 2×3=6 3×3=9

1×4=4 2×4=8 3×4=12 4×4=16

1×5=5 2×5=10 3×5=15 4×5=20 5×5=25

1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36

1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49

1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64

1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

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

#!/bin/bash

declare -i max=0

declare -i min=0

for i in {1..10} ;do

  tmp=$RANDOM

  [ $i -eq 1 ] && min=$tmp

  if [ $i -le 9 ] ;then

     echo -n "$tmp"

  else

     echo "$tmp"

  fi

  if [ $tmp -gt $max ] ;then

     max=$tmp

  elif [$tmp -lt $min ] ;then

     min=$tmp

  fi

done

echo "the max random is $max"

echo "the min random is $min"

 

5、打印国际象棋棋盘

  1#!

  2 #

  3 for i in $(seq 1 8);do

  4 for j in $(seq 1 8);do

  5 [ $[i%2-$j%2] -eq 0 ] &&  echo -ne "\033[41m  \033[0m" ||  echo -ne "\033[47    m  \033[0m"

  6 let j++

  7 done

  8 echo ""

  9 let i++

 10 done

 11 

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

(0)
a1215276209a1215276209
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相关推荐

  • GDB中应该知道的几个调试方法

    七、八年前写过一篇《用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。 一、多线程调试 多线程调试可能是问得最多的。…

    Linux干货 2016-07-11
  • Lua简明教程

    这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动。我很好奇得浏览了一下Lua解释器的源…

    Linux干货 2016-08-15
  • 根分区伸缩实验

    众所周知LVM是Linux环境下对 磁盘进行管理的一种机制。用户在安装Linux操作系统时,难以分配合适的硬盘空间,当一个分区存放不下某个文件时,这个文件因为文件系统的限制,也不能 跨越多个分区来存放。而遇到出现某个分区耗尽时,只有使用调整分区大小的工具。随着LVM功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方 便…

    Linux干货 2015-05-27
  • Linux网站架构系列之Mysql—-部署篇

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1321079   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL所使用的SQL语言是用于…

    Linux干货 2015-04-01
  • 远程使用sshd连接不上服务器解决方案

    前些天在学习linux的时候CRT怎么也连接不上我的linux服务器了,整了半天,请教了一些高人才把这个问题解决,现在整理一下我的解决方案。 大家可以看到配置都正确但就是连不上。 通过查看得出原来是22端口拒绝~! 那么我就去查看22端口有没有开启 大家可以看到我的22端口也就是sshd服务并没有开启。 我去开启我的sshd服务器,但是又出现了问题~! 随后…

    Linux干货 2016-03-28
  • 回溯法 -数据结构与算法

    1.回溯法算法思想: 定义:         回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 1、回溯法适用:有许多问题,当需要找出它的解集(…

    Linux干货 2015-04-07