Shell脚本编程3

Shell脚本编程3 

一、杂项知识整理

1、selectcase

select是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c退出循环,自动生成数字的选择项,适合创建菜单。

select经常和case联合使用。与for循环类似,可以省略in LIST,此时使用位置参量$1$2等传递参数。

case不是无限循环,select适合于case一起使用,当使用的时候case在其内部使用的分支参数是选项代表的参数而不是选项数字。

#!/bin/bash
#
PS3="what do you want?"
select caidan in gongbaojiding  qingzhengyu  wanzi;do
    case $caidan in
    gongbaojiding)
        echo "cost 10"
        break
        ;;  
    wanzi)
        echo "cost 30"
        ;;  
    *)  
        echo "cost 25"
        ;;  
    esac
done
        echo $REPLY

2、set命令查看所有环境变量和系统定义的函数。

 

二、事例详解及命令

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

while read linedo

循环体

done  <  /PATH/FROM/SOMEFILE

一次读取文件中的米一行,且将行赋值给变量line

例如:扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985665,并提示该用户的GECOS信息修改成功。

#!/bin/bash
#read line 
#test 
while read LINE; do 
    if echo $LINE | grep "::" &> /dev/null; then
        USER=`echo $LINE  | cut -d: -f1`
        chfn -f $USER $USER &> /dev/null
        chfn -p "62985600" $USER &> /dev/null
        echo "$USER infomation has changed"
    fi  
done < /etc/passwd

2、特殊用法之双小括号方法,即(())格式,也可以用于算数运算。双小括号方法也可以使bash shell实现c语言风格的变量操作。for循环的特殊格式:

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

循环体

done

控制变量的初始化:仅在运行到循环代码段时执行一次;

控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

#!/bin/bash
#9*9
#
for ((i=1;i<=9;++i));do
    for ((j=1;j<=i;j++));do
        echo -ne "$j*$i=$[$i*$j]\t"
    done
    echo   
done
echo 
3、select variable in list
do
循环体命令
done

select循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3提示符,等待用户输入

用户输入菜单列表中的某个数字,执行相应的命令。

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

4、函数介绍:函数是由若干条shell命令组成的语句块,实现代码重用和模块化编程。它与shell程序形式上是相似的,不同的是他不是一个单独的进程,不能独立运行,而是shell程序的一部分。

函数和shell程序比较相似,区别在于:

shell程序在子shell中运行,而shell函数在当前shell中运行,因此在当前shell中,函数可以对shell中变量进行修改。若在函数定义了一个变量,脚本中也定义了同名的变量,在当前shellecho此变量值的时候显示的是函数中的值,因为脚本不执行在当前shell中。

5、函数定义:function funcname{}funcname(){}

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

调用:函数只有被调用才会执行;调用:给定函数名;函数名出现的地方,会被自动替换为函数代码。

函数返回值:函数有两种返回值:函数的执行结果返回值和函数的退出状态码;

函数的退出状态码:默认取决于函数中执行的最后一条命令的退出状态码;自定义退出状态码,格式为:

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

return 0 无错误返回

return 1-255 有错误返回

6、在交互环境下定义了函数将一直保留到用户从系统退出或执行了unset funcname的命令

脚本中定义及使用函数:函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次依次执行到它后才能使用。调用函数仅使用其函数名即可。

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

一旦函数文件载入shell,就可以在命令行或脚本中调用函数。可以使用set命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数。若要改动函数,首先用unset命令从shell中删除函数,改动完毕后,再重新载入此文件。

函数文件创建好后载入shell.  filenamesource  filename,文件名要带正确路径

7、传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;例如:testfunc  arg1  arg2

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

8、在函数中定义局部变量的方法:local NAME=VALUE:局部变量定义后,只能在函数体内部使用此变量。

9、函数递归:函数直接或间接调用自身;注意递归层数。

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

阶乘用递归方式定义:0=1n=n-1)!*n=nn-1)(n-2…1

#!/bin/bash
#jiecheng
#
fact() {
    if [ $1 -eq 0 -o $1 -eq 1 ];then
        echo 1
    else
        echo $[$1*$(fact $[$1-1])]
    fi  
}
fact $1

三、课后练习

1、斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁

 

殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:011

 

2358132134、……,斐波纳契数列以如下被以递归的方法定义

 

F0=0F1=1Fn=F(n-1)+F(n-2)n2

写一个函数,求n阶斐波那契数列

#!/bin/bash
#rabit
#
GOLD() {
if [ "$1" -eq 0 ];then
    echo 0
elif [ "$1" -eq 1 ];then
    echo 1
else
    echo $[$(GOLD $[$1-1])+$(GOLD $[$1-2])]
fi
}
 
read -p "Please input a number: " NUM 
GOLD $NUM

2、实现汉诺塔

#!/bin/bash
#Hanoi
#
Hanoi() {
 
if [ "$1" -eq 1 ];then
    echo "$2--$4"
else
    Hanoi $[$1-1] $2 $4 $3  
    echo "$2--$4"
    Hanoi $[$1-1] $3 $2 $4
fi
}
 
read -p "Please input a number: " N
Hanoi $N X Y Z

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

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

相关推荐

  • 深入理解php底层:php生命周期

    1、PHP的运行模式:     PHP两种运行模式是WEB模式、CLI模式。无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行。 1、当我们在终端敲入php这个命令的时候,它使用的是CLI。 它就像一个web服务器一样来支持php完成这个请求,请求完成后再重新把控制权交给终端。 2、当使用Apache或者别web服务器…

    系统运维 2015-05-28
  • 关于大型网站技术演进的思考(十一)–网站静态化处理—动静分离策略(3)

    原文出处: 夏天的森林   前文里我讲到了网站静态化的关键点是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。由此可见,网站静态化处理的核心就是动静分离和缓存两大方面,上篇我简单讲述了动静…

    Linux干货 2015-03-11
  • 软件包管理rpm和yum基本使用

    RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。 rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,…

    Linux干货 2016-08-29
  • Memcached + MSM 实现Tomcat Session保持

    Memcached + MSM 实现Tomcat Session保持 tomcat memcached 前言 Memcached介绍 MSM介绍 实验拓扑 实验环境 实验步骤 安装配置Tomcat 安装配置Nginx负载均衡 安装配置Memcached + MSM 总结 前言 上篇文章我们实现了session sticky和session clus…

    2016-04-22
  • 文件权限

    一、文件权限        linux系统中文件众多,针对不同的文件面向的对象不同,因此对其设置的权限各不相同,那么我们来对文件设置权限呢?               …

    Linux干货 2016-08-08
  • 手动添加用户

        通常使用useradd命令可以轻松添加一个用户,然后使用passwd命令设置一个密码后就可以登录系统了,其实这一过程完成可以自己手动完成,下面就让我们来通过修改配置文件来添加一个用户。 一、修改/etc/passwd文件     在etc/passwd文件中手动添加一行内…

    Linux干货 2015-04-27

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-21 22:44

    shell脚本能代替我们是实现一些自动化的功能,同时函数也是脚本中最常使用的思想,它能实现代码重用和提高工作效率,对脚本而言,没有特殊的捷径,只有多写,多看,才能快速提高自己的脚本能力。