循环 函数 软件包 【中】

循环 函数 软件包  【中】

 创建无限循环

while true; do 

   循环体 

done

until false; do 

   循环体 

Done

特殊用法

while循环的特殊用法(遍历文件的每一行): 

      while read line; do 

        循环体 

     done < /PATH/FROM/SOMEFILE  

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将 行赋值给变量line 

示例

[root@localhost bin]# bash wenben.sh

#!

#

read -p "please input [yesno]:" a

case $a in

[yY]|[yY][eE][sS])

echo "the user input $a"

;;

[nN]|[nN][oO])

echo "the user input $a"

;;

*)

echo "eht user innput other"

;;

esac

[root@localhost bin]# cat wenben.sh

#/bin/bash

while read line

do

    echo $line

    done < uu.sh

[root@localhost bin]# 

特殊用法之小括号

双小括号方法,即((…))格式,也可以用于算术运算  

双小括号方法也可以使bash Shell实现C语言风格的变量操作 

   #I=10 

   #((I++)) 

 

for循环的特殊格式: 

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式)) 

do 

    循环体 

done  

控制变量初始化:仅在运行到循环代码段时执行一次  控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算 ,而后再做条件判断

select 循环与菜单 

select variable in list 

do 

   循环体命令 

done 

select 循环主要用于创建菜单,按数字顺序排列的 菜单项将显示在标准错误上,并显示 PS3 提示符, 等待用户输入  用户输入菜单列表中的某个数字,执行相应的命令  

用户输入被保存在内置变量 REPLY 中。

select 与 case 一般是一起用的

select 是个无限循环,因此要记住用 break 命令退 出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环。 

select 经常和 case 联合使用 

与 for 循环类似,可以省略 in list ,此时使用位置 参量

函数介绍

 

  1  函数function是由若干条shell命令组成的语句块,实现代码 重用和模块化编程。  

  2  它与shell程序形式上是相似的,不同的是它不是一个单独的 进程,不能独立运行,而是shell程序的一部分。  3  函数和shell程序比较相似,区别在于:  

  4  Shell程序在子Shell中运行  

  5  而Shell函数在当前Shell中运行。因此在当前Shell中,函数可以 对shell中变量进行修改

  函数由两部分组成:函数名和函数体。  

  语法一: 

  

  function f_name { 

  

  …函数体… 

  }  

  语法二: 

  

  function f_name () { 

  …函数体… 

  }  

  语法三: 

  f_name (){ 

  …函数体… 

  }

   函数的定义和使用: 可在交互式环境下定义函数 可将函数放在脚本文件中作为它的一部分 可放在只包含函数的单独文件中  

   调用:函数只有被调用才会执行; 

   调用:给定函数名 函数名出现的地方,会被自动替换为函数代码  

   函数的生命周期:被调用时创建,返回时终止

   函数返回值

 

函数有两种返回值:  函数的执行结果返回值: 

  (1) 使用echo或printf命令进行输出 

  (2) 函数体中调用命令的输出结果  

函数的退出状态码: 

  (1) 默认取决于函数中执行的最后一条命令的退出状态码 

  (2) 自定义退出状态码,其格式为: 

  return  从函数中返回,用最后状态命令决定返回值 

  return 0  无错误返回。 

  return 1-255  有错误返回

交互式环境下定义和使用函数

 例如: 

$dir() { 

> ls -l 

> }  

定义该函数后,若在$后面键入dir,其显示结果同ls -l的 作用相同。 

$dir  

该dir函数将一直保留到用户从系统退出,或执行了如下 所示的unset命令: 

$ unset dir

在脚本中定义及使用函数

 函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至 shell首次发现它后才能使用  调用函数仅使用其函数名即可。  

例如: 

$cat func1 

#!/bin/bash 

# func1 hello() { 

    echo "Hello there today's date is `date +%F`" 

    echo "now going to the function hello" 

    hello 

    echo "back from the function"   

 使用函数文件

 

 1 可以将经常使用的函数存入函数文件,然后将函 数文件载入shell。 

 2 文件名可任意选取,但最好与相关任务有某种联 

 3 一旦函数文件载入shell,就可以在命令行或脚本 中调用函数。可以使用set命令查看所有定义的函 数,其输出列表包括已经载入shell的所有函数。    

 4 若要改动函数,首先用unset命令从shell中删除 函数。改动完毕后,再重新载入此文件。

 创建函数文件

 函数文件示例: 

$cat  functions.main 

#!/bin/bash 

#functions.main findit() { 

if [ $# -lt 1 ] ;  then 

    echo "Usage:findit file" return 1 

    fi 

    find / -name $1 –print 

}

载入函数

 函数文件已创建好后,要将它载入shell  

   定位函数文件并载入shell的格式: 

   . filename 或 source   filename   

   此即<点> <空格> <文件名> 这里的文件名要带正确路径  

   上例中的函数,可使用如下命令: $ . functions.main

检查载入函数

 使用set命令检查函数是否已载入。set命令将在shell中显示 所有的载入函数。  

示例: 

$set findit=( ) { 

if [ $# -lt 1 ]; then 

    echo "usage :findit file"; 

    return 1 

    fi 

    find / -name $1 -print 

} … 

执行shell函数

 要执行函数,简单地键入函数名即可:  

示例: 

$findit groups 

/usr/bin/groups 

/usr/local/backups/groups.bak

删除shell函数  现在对函数做一些改动。首先删除函数,使其对shell不可用 。使用unset命令完成此功能.  命令格式为: 

  unset  function_name

 

实例: 

    $unset findit 

    再键入set命令,函数将不再显示

函数参数

 函数可以接受参数: 

    传递参数给函数:调用函数时,在函数名后面以空白分隔 给定参数列表即可;

    例如“testfunc arg1 arg2 …” 

在函数体中当中,可使用$1, $2, …调用这些参数;还 可以使用$@, $*, $#等特殊变量

函数变量

 变量作用域: 

  

  环境变量:当前shell和子shell有效 本地变量:只在当前shell进程有效,为执行脚本会启动 专用子shell进程;因此,本地变量的作用范围是当前shell脚本 程序文件,包括脚本中的函数。 

  局部变量:函数的生命周期;函数结束时变量被自动销毁  

注意:如果函数中有局部变量,如果其名称同本地变量,使 用局部变量。  

  在函数中定义局部变量的方法 local NAME=VALUE

  函数递归实例

 函数递归: 

    函数直接或间接调用自身 

    注意递归层数  

    递归实例: 阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语 一个正整数的阶乘(factorial)是所有小于及等于该数的正整 数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。 

    n!=1×2×3×…×n。 

    阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。 

    n!=n(n-1)(n-2)…1 

    n(n-1)! = n(n-1)(n-2)!

    示例: 

    fact.sh 

    #!/bin/bash 

    # fact() { 

    if [ $1 -eq 0 -o $1 -eq 1 ]; then 

        echo 1 else echo $[$1*$(fact $[$1-1])] 

        fi 

     } 

        fact $1

软件包管理

包查询

rpm {-q|–query} [select-options] [query-options] 

  [select-options] -a: 所有包 

  -f: 查看指定的文件由哪个程序包安装生成 

  -p rpmfile:针对尚未安装的程序包文件做查询操作; 

  –whatprovides CAPABILITY:查询指定的CAPABILITY 由哪个包所提供 

  –whatrequires CAPABILITY:查询指定的CAPABILITY被 哪个包所依赖 

  rpm2cpio 包文件|cpio –itv 预览包内文件 

  rpm2cpio 包文件|cpio –id  “*.conf” 释放包内文件

  [query-options] 

  –changelog:查询rpm包的changelog 

  -c: 查询程序的配置文件 

  -d: 查询程序的文档 

  -i: information -l: 查看指定的程序包安装后生成的所有文件; 

  –scripts:程序包自带的脚本片断 

  -R: 查询指定的程序包所依赖的CAPABILITY; 

  –provides: 列出指定程序包所提供的CAPABILITY

  查询用法: 

  -qi PACKAGE, 

  -qf FILE, 

  -qc PACKAGE, 

  -ql PACKAGE, 

  -qd PACKAGE 

  -qpi PACKAGE_FILE, 

  -qpl PACKAGE_FILE, … 

  -qa  

  卸载: 

  rpm {-e|–erase} 

      [–allmatches] 

      [–nodeps] 

      [-noscripts] 

      [–notriggers] 

      [–test] 

                    PACKAGE_NAME …

包校验

rpm {-V|–verify} [select-options] [verify-options] 

      S file Size differs 

      M Mode differs (includes permissions and file type) 

      5 digest (formerly MD5 sum) differs 

      D Device major/minor number mismatch 

      L readLink(2) path mismatch 

      U User ownership differs 

      G Group ownership differs 

      T mTime differs 

      P capabilities differ

  包来源合法性验正及完整性验正: 

      完整性验正:SHA256 

      来源合法性验正:RSA  

  公钥加密: 

      对称加密:加密、解密使用同一密钥; 

      非对称加密:密钥是成对儿的 

          public key: 公钥,公开所有人 

          secret key: 私钥, 不能公开  

  导入所需要公钥: 

          rpm  -K|checksig rpmfile 检查包的完整性和签名 

          rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

          CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7 

          rpm -qa gpg-pubkey*

rpm数据库

 

数据库重建: /var/lib/rpm rpm {–initdb|–rebuilddb} 

          initdb: 初始化 

                  如果事先不存在数据库,则新建之 否则,不执行任何操作 

          rebuilddb:重建 

                  无论当前存在与否,直接重新创建数据库

yum

CentOS: yum, dnf 

      YUM: Yellowdog Update 

      1 Modifier,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包, 

      2 up2date的替代工具 yum repository: yum repo,存储了众多rpm包,以及 包的相关的元数据文件(放置于特定目录repodata下) 

      文件服务器: 

         ftp:// 

         http:// 

         file:///

yum配置文件 

    yum客户端配置文件: 

      /etc/yum.conf:为所有仓库提供公共配置 

      /etc/yum.repos.d/*.repo:为仓库的指向提供配置 

      仓库指向的定义: 

      [repositoryID] 

      name=Some name for this repository 

      baseurl=url://path/to/repository/ 

      enabled={1|0} 

      gpgcheck={1|0} 

      gpgkey=URL 

      enablegroups={1|0} 

      failovermethod={roundrobin|priority} 

      默认为:roundrobin,意为随机挑选; 

      cost=    默认为1000

用循环 显示一个等腰三角形

root@localhost bin]# chmod a+x sanjiaooo.sh

[root@localhost bin]# sanjiaooo.sh

please enter a number:10

         #

        ###

       #####

      #######

     #########

    ###########

   #############

  ###############

 #################

###################

[root@localhost bin]# cat sanjiaooo.sh

#!/bin/bash

#

read -p "please enter a number:" n

for k in `seq  $n`;do

    for j in `seq $[$n-$k]`;do

    echo -n " "

done

    i=$[$k*2-1]

for l in `seq $i`;do

    echo -n "#"

done

    echo

done    

[root@localhost bin]# 

用select和case 做个简易菜单

[root@localhost bin]# caidan.sh

1) gongbaojiding  3) baoyu    5) xie

2) hongshaorou  4) dayu    6) xia

how do you like?1

10 yuan

[root@localhost bin]# caidan.sh

1) gongbaojiding  3) baoyu    5) xie

2) hongshaorou  4) dayu    6) xia

how do you like?3

100yuan

[root@localhost bin]# cat caidan.sh

#!/bin/bash

#

PS3="how do you like?"

select caidan in gongbaojiding hongshaorou baoyu dayu xie xia

do

    case $caidan in

    gongbaojiding)

    echo "10 yuan"

    break

    ;;

    hongshaorou)

    echo "20 yuan"

    break

    ;;

    baoyu)

    echo "100yuan"

    break

    ;;

    dayu)

    echo "40 yuan"

    break

    ;;

    xie)

    echo "88 yuan "

    break

    ;;

    xia)

    echo "99 yuan "

    break

    ;;

    *)

    echo "no exist"

    break

    esac

done    

[root@localhost bin]# 

汉诺塔 游戏

[root@localhost bin]# hannuotao.sh

please input the number you want:3

move 1: A–>C

move 2: A–>B

move 1: C–>B

move 3: A–>C

move 1: B–>A

move 2: B–>C

move 1: A–>C

[root@localhost bin]# cat hannuotao.sh

 #!/bin/bash

 read -p "please input the number you want:" n

 a="A"

 b="B"

 c="C"

 game(){

 if [ $1 -eq 1 ];then

 echo "move $1: $2–>$4"

 else

 game $[$1-1] $2 $4 $3

 echo "move $1: $2–>$4"

 game $[$1-1] $3 $2 $4

 fi

 }

 game $n $a $b $c

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

(0)
上一篇 2016-08-21 20:47
下一篇 2016-08-22 08:44

相关推荐

  • 早安

    既来之,则安之。好好学习,努力奋斗!!!#linux#

    Linux干货 2017-07-11
  • 在CentOS 6上编译安装LAMP

    在CentOS 6上编译安装LAMP     在生产中如果需要使用较新的服务,而系统提供的rpm包又较老时该怎么办呢?其实应用程序的安装方式有多种,如:使用系统发行商提供rpm包或者下载源码包手动编译安装也是可以的。今天我们编译的服务不是一个单独的而是一套。这套黄金搭档从诞生之初到现在已经经过无数用户的验证,各大电商站点、门户网站、以及各…

    Linux干货 2017-04-23
  • Linux系统启动流程简介

    centos系统启动流程 本篇仅仅讲解centos5和6 centos7并不适用 Linux系统的组成部分:内核+根文件系统 内核功能: 进程管理 内存管理 网络管理 驱动程序 文件系统 安全功能 有以下目录结构的文件系统可以被识别为根文件系统,但根文件系统本身不存在 rootfs:/bin/ /sbin /etc/ /sys/…

    Linux干货 2016-09-10
  • 马哥教育网络班20期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who |cut -d " " -f1 |sort -u 2、取出最后登录到当前系统的用户的相关信息。 [root@localhost ~]# who|tai…

    Linux干货 2016-06-29
  • Linux Basics–part4

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限 ~]# cp -rf /etc/skel/ /home/tuser1 && chmod -R go=— /home/tuser1 [root@ronny1 ~]# ll -d /home/tuser…

    Linux干货 2017-08-07