我的朗科运维第八课

shell编程之执行结构

case分支选择结构:

case 词 in [模式 [| 模式] ...) 命令 ;; ] ... esac

case 变量引用 in

模式1)

分支1

;;

模式2)

分支2

;;

...

*)

默认分支

;;

esac

模式(PATTERN):

1.普通的文本字符

2.globbing风格的通配符

*:任意长度任意字符

?:任意的单个字符

[]:范围内的任意单个字符

[^]:范围外的任意单个字符

3.|:或

例:提示用户输入信息,然后判断用户输入的信息是否合法;

#!/bin/bash
#
read -p "Please make your choice[yes of no]: " CHOICE
case $CHOICE in
    yes|YES)
        echo "right."
        ;;
    NO|no)
        echo "wrong."
        ;;
    *)
        echo "Unknow."
        ;;
esac

if的分支结构和case的分支结构之间的区别:

相同点:

1.都是条件为真,执行对应分支的语句;条件为假,就不执行;

2.都可以设置默认分支语句,即:所有条件都不匹配的时候,所执行的语句;

不相同点:

1.if是根据命令的执行状态返回值来判断正确与否;case是根据变量的值的取值内容是否匹配模式来判断正确与否;

2.case的每个分支都必须使用“;;”结束;

while与until循环结构:

while

while 命令 ; do 命令 ;done

while CONDITION ; do

循环体

done

进入循环条件:CONDITION一直为真

退出循环条件:CONDITION为假

until

until 命令 ; do 命令 ; done

until CONDITION ; do

循环体

done

进入循环条件:CONDITION一直为假

退出循环条件:CONDITION为假

其中:while CONDITION ; do CMD ; done 相当于 until ! CONDITION ; do CMD ; done

注意: 对于while和until两个循环结构来讲,如果要实施变量增量操作,必须手动给出;

例:利用while和until循环结构,计算100以内所有整数的和;

#!/bin/bash
#
declare -i I=1
while [ $I -lt 100 ] ; do
    let SUM+=$I
    let l++
done
echo $SUM

#!/bin/bash
#
declare -i I=1
until [ $I -gt 100 ] ; do
    let SUM+=$I
    let I++
done
echo $SUM

循环控制语句:

continue

break

continue:

continue [n]

提前结束第n层的本次循环,直接进入下一轮条件判断,若符合循环进入条件,则开启下一轮循环;

break:

break [n]

提前结束第n层循环;不再继续后续循环;

无限循环用法:

while true ; do

循环体

done

until false ; do

循环体

done

在此类的循环结构中,必须适当的使用continue和break,以保证循环不会一直持续下去;

能够实现遍历功能的while循环;

while read LINES ; do

循环体

done < /PATH/FROM/SOMEFILE

until ! read LINES ; do

循环体

done < /PATH/FROM/SOMEFILE

例:文件abc.txt内容如下:

1,2,3,5,6

b,d,g,h,e

6,3,7,1,7

f,g,e,y,a

写一个脚本,利用循环结构,输出每一行的第二个和第四个字符(以逗号分隔)

#!/bin/bash
#
while read LINES ; do
    echo -n $LINES | cut -d, -f2,4 | tr ‘\n‘ ‘,‘
done < abc.txt

select

select循环只要用于创建一个菜单式列表,供用户进行选择;

列表是按照数字顺序排列的,我们只要选择数字即可;

一般来讲,select与case一起使用;

seelcet是一个无限循环结构,因此,必须在循环体中使用break命令以退出循环,或者可以使用exit命令直接终止脚本运行;

select NAME [in 词语 ...; ] do 命令 ; done

select NAME [in LIST] ; do

命令

done

例子:

#!/bin/bash
#
select | in meat soap rice vag ; do
    case $I in
        meat)
            echo "I like it."
            break
            ;;
        soap)
            echo "I don‘t like it."
            continue
            ;;
        *)
            exit
   esac
done

shell脚本编程之函数

systemV风格的服务管理脚本:

给脚本传递一些参数:start,stop,restart,status

例:#ssh [email protected]

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行;

程序员将这种被封装起来的代码称为功能提,或者叫模块;

function -- 函数

在shell脚本编程中,函数是由若干条shell命令组成的语句快,通常用于代码重用和模块化封装;

函数里面的内容和shell程序形式上是一致的;不同之处就是,shell代码可以直接被执行;而函数中的内容,不能独立执行,只有被调用的时候才被执行;

函数是在shell程序的当前shell中运行的;

定义函数:

函数是由两部分组成:函数名称+函数体(能够实现独立功能的shell语句块)

语法一:

function func_name{

函数体

}

语法二:

func_name(){

函数体

}

注意:函数名和()之间不能有空白字符;

函数的使用:

函数在定义的时候,其函数体中包含的所有命令均不会被执行,只有函数被调用的时候,才会执行其中的命令语句;

调用方式:通过直接给出函数名称的方式调用;

有很多的函数是存放与专门用于保存函数的文件中,如果想要调用这样的文件中保存的函数,使用source命令(.)加载文件,然后再以直接给出函数名称的方式调用函数;

使用set命令可以查看所有当前shell中国生效的函数;

使用unset命令可以撤销已经定义的函数;

函数的返回值:

两种返回值:

函数的执行结果的返回值:

1.在函数体中使用了echo或printf命令输出结果;

2.在函数体中某些命令输出的结果;

函数的状态返回值:

1.函数中最后一跳命令的执行状态返回值;

2.自定义退出状态码;

return [n]

n:0-255(1 2 127尽可能不适用)

0:表示无错误返回

1-255:有错误返回

注意:只要函数在执行是,遇到了return命令,不管函数中的命令语句是否全部执行完成,立刻退出函数;

函数的声明周期:

从被调用开始,到遇到return命令或全部的语句执行完成为止;

函数的实参:

在函数体中,可以使用$1,$2,...位置变量为函数提供参数;还可以使用$*或[email protected]的方式引用所有位置参数;还可以使用$#计算为函数传递的参数个数;

在调用函数的时候,直接在函数名称后面以空白字符分隔多个参数即可;

比如: func_name arg1 arg2 ...

例子:

#!/bin/bash
#
addusers(){
    for I in {1..5} ; do
        if id $1$I &> /dev/null | ; then
            echo "User $1$I exists."
            return 5
        else
            useradd $1$I &> /dev/null
            echo $1$I | passwd --stdin $1$I
            echo "Create user $1$I funished."
        fi
    done
}
addusers $1

传递给函数的位置参数,是调用函数的时候,函数名称后面的有空白字符分隔的字符串序列;跟脚本的位置参数不是一回事;

变量:

shell中的变量为弱变量

1.无需事先声明

2.无需指定变量类型,默认为字符型

变量分类:

环境变量: 当前shell及子shell

本地变量: 当前shell

局部变量: local VAR_NAME=VALUE当前函数体

位置变量:

特殊变量:

建议:手动销毁自己定义或声明的所有变量;

函数的递归调用

简单来说,就是在函数体中调用函数自身;

例:阶乘:N!=N*(N-1)!=N*(N-1)*(N-2)!=...=N*(N-1)*(N-2)*...*2*1

#!/bin/bash
#
fact(){
    if [ $1 -eq 0 ] || [ $1 -eq 1 ] ; then
        echo 1
    else
        echo "$[$1*$(fact $[$1-1])]"
        fi
}
ehco -n "$1!="
fact $1
时间: 2024-11-03 22:07:09

我的朗科运维第八课的相关文章

我的朗科运维第七课

shell脚本编程 在讲shell脚本编程前,先了解一下bash的颜色显示规则: bash的颜色显示规则是按照ASCII编码对颜色进行设置的:其一些常用的编码有: \033:Ctrl键: [:控制颜色属性命令: 0m:关闭颜色属性命令: 1m:加粗显示文本字符: 4m:为文本字符加下划线标识: 5m:使文本字符闪烁: 7m:将文本字符的背景色和前景色交换显示: 8m:将文本字符的背景色和前景色设置为相同颜色: 30m-39m:设置文本字符的前景色:38m和39m暂时保留: 40m-49m:设置文

我的朗科运维第六课(1)

文本处理三剑客 grep系:grep.egrep.fgrep,文本搜索工具,居于"PATTERN"对于给定的文本进行模糊搜索. sed:tream EDitor,流编辑器,行编辑器,文本编辑工具: awk:gawk--GNU awd,文本格式化工具,文本报告生成器,文本处理的编辑语言: grep系:grep.egrep.fgrep grep:Global search REgular expression and Print out the line. 利用增则表达式进行全局搜索并将匹

我的朗科运维第五课(1)

为了更好地保护系统的安全,linux系统中采用了用户权限管理. 其中用户的权限分为:普通权限.特殊权限.文件的特殊权限.FACL. 普通权限: 进程安全上下文: 1.判断进程的所有者是否为想要操作的属主,如果是,就按照属主的权限进行授权:如果不是,就转到第二条: 2.判断进程的所有者是否为想要操作的文件的属组中的成员,如果是,就按照属组的权限进行授权:如果不是,就转到第三条: 3.按照其他用户的权限进行授权: 权限的构成: MODE(Permission):使用权 r:Readable:可读 w

我的朗科运维第四课(2)

用户和组的管理 所采用的认证为Cisco开发的AAA认证体系: Authetication:认证,核实身份是否正确: Authorization:授权,对已经核实身份的用户进行资源分配: Accounting:审计,监管资源被使用的情况: Linux是一个多用户.多任务的系统: 能够实现资源使用和完成的任务的主体是:应用程序进程 进程是以其发起者的身份运行的:可以理解为:进程的所有者就是发起者:会将发起者信息标记在进程上: 当进程试图访问资源的时候,安全上下文会对比进程的所有者和资源的所有者的关

Linux云自动化运维第四课

Linux云自动化运维第四课 一.vim 1.vim光标移动 1)在命令模式下 :数字  ###移动到指定的行 G  ###文件最后一行 gg  ###文件第一行 2)在插入模式下 i  ###光标所在位置插入 I  ###光标所在行行首 a  ###光标所在字符的下一个位置 A  ###光标所在行行尾 o  ###光标所在行下一行 O  ###光标所在行上一行 s  ###删除光标所在字符插入 S  ###删除光标所在行插入 2.vim的退出模式 :q  ###当用vim打开文件但没有对字符作

Linux运维第七课----Linux基础优化

一.find找出文件,并替换文件内容[[email protected] ~/data]# find /root/data/ -type f -name '.txt' ./oldboy.txt./acheng.txt./magua.txt./op.txt1.方法一 [[email protected] ~/data]# find /root/data/ -type f -name '.txt' -exec sed -i 's#sh#hs#g'[[email protected] ~/data]#

最新linux运维高级架构课13期 架构师课程

有会员购买的,分享给大家.完整一套,可以学习一下. ├─L001-2017linux运维高级架构师13期-运维与自动化运维发展-10节 │      1-1运维职业发展.avi │      1-2运维职业发展.avi │      1-3运维职业发展.avi │      10-1ITIL故障管理和问题管理.avi │      10-2ITIL故障管理和问题管理.avi │      10-3ITIL故障管理和问题管理.avi │      2-1运维知识系统和分类.avi │      2

我的朗科运维第一课

初学linux系统, 得先知道命令格式: COMMAND OPTIONS ARGUMENIS[PARAMETERS] 必须得先学会以下这些命令: type    查看命令是属于内部命令还是外部命令 help    查看内部命令的帮助 man    查看外部命令的帮助 hash    查看缓存中用过的命令

Linux云自动化运维第二十课

第五单元 iSCSI远程块存储 一.iSCSI概念 iSCSI(Internet SCSI)支持从客户端(发起端)通过IP向远程服务器上的SCSI存储设备(目标)发送SCSI命令.iSCSI限定名称用于确定发起端和目 标,并采用iqn.yyyy-mm.{reverse domain}:label的格式.默认情况下,网络通信是至iSCSI目标上的端口3260/tcp的明文. 1.iSCSI发起端:需要访问原始SAN存储的客户端. 2.iSCSI目标:从iSCSI服务器提供的远程硬盘磁盘,或"目标门