shell-语句总结

shell脚本语法总结

过程式编程语言:

顺序执行
选择执行
循环执行

shell默认是顺序执行,如果有判断或循环语句则执行判断或循环。

条件判断

if
    单分支
        if 判断条件:then
            条件为真的分支代码
        fi

    双分支
        if 判断条件; then
            条件为真的分支代码
        else
            条件为假的分支代码
        fi

    多分支
    if CONDITION1; then
        if-true
    elifCONDITION2; then
        if-ture
    elifCONDITION3; then
        if-ture
        ...
    else
        all-false
    fi
    逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
    if取的是判断语句的运行状态返回值。true or false

case
    case 变量引用 in
        PAT1)
            分支1
            ;;
        PAT2)
            分支2
            ;;
        ...
        *) #任意长度任意字符 (最终会匹配的条件)可以不写这个条件
            默认分支
            ;;
        esac
    =====================================================
    pat)通配模式

        case支持glob风格的通配符:
            *: 任意长度任意字符
            ?: 任意单个字符
            []:指定范围内的任意单个字符
            a|b: a或b

注case 分支语句要用双分号结尾。
case中的patter后的分支语句通过golb通配case引用的变量,匹配则执行分支语句。不匹配则往下执行。

循环

for
    for循环  循环条件是列表不为空,列表中的数据用完则循环结束

        for 变量名in 列表;do
            循环体
            ..
        done

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

while
    while CONDITION; do

        循环体
        done

    CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环 
    因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
    进入条件:CONDITION为true;    
    退出条件:CONDITION为false

until
    ntil循环  条件为假时开始循环,条件为真时结束循环。

    until CONDITION; do
            循环体
    done

    进入条件:CONDITION 为false
    退出条件:CONDITION 为true
    CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

continue

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

while CONDTIITON1; do
    CMD1
    ...
    if CONDITION2; then
        continue
    fi
    CMDn
    ...
done

break—跳出循环 ,并停止整个循环。默认是1

break 后可以加数字 --用于循环体中,可以指定跳出那一层循环(存在嵌套循环)。

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

    while CONDTIITON1; do
    CMD1
    ...
    if CONDITION2; then
    break
    fi
    CMDn
    ...
done

创建无限循环

while true; do5
    循环体
done

until false; do
    循环体
Done

exit

只要在脚本中出现exit则脚本退出执行。
如果在脚本的子shell中出现exit则退出子shell脚本运行。

交互–用户输入

select 属于循环语句
select variable in LIST
        do
            循环体命令
        done

    运行后,用户按提示(根据in后面的列表生成的菜单)输入选择,则将select将后面的变量名赋值为对应的in列表中的值。
    elect 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入
    用户输入菜单列表中的某个数字,执行相应的命令
    用户的输入 被保存在内置变量REPLY 中。

    常配合case使用



read
使用read来把输入值分配给一个或多个shell变量:
    -p指定要显示的提示
    -t TIMEOUT
    read从标准输入中读取值,给每个单词分配一个变量
    所有剩余单词都被分配给最后一个变量
    read -p “Enter a filename:“ FILE

函数

函数function是由若干条shell命令组成的语句块
实现代码重用
模块化编程
机构化编程
把独立功能的代码当作一个整体,并为之一个名字;命名的代码段,此即为函数;

函数命名应尽量避免与命令或系统关键字重名。命名法则与变量相同  

语法一:

        function f_name{
        ...函数体...
        }

    语法二:(常用)

        f_name() {
        ...函数体...
        }

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

    调用:函数只有被调用才会执行;
        再脚本中调用:给定函数名;函数名出现的地方,会被自动替换为函数代码
        交互式环境下,注销函数 使用 unset 函数名 

函数支持位置参数变量和特殊变量;在脚本中,脚本的位置参数变量和特殊变量与其内部函数的位置参数变量和特殊变量不是同一变量,注意区别开
注:函数放在调用函数的代码之前,定义代码段不执行,调用才执行。一般都放到脚本的前面先定义好函数。下面在调用。

return

定义脚本最后一条命令的返回值,多用于给函数定义
例如函数内部有条件判断语句,不同情况下,每个语句都有执行成功的可能。这样可以给每中情况定义不同的状态返回值。

local

定义局部变量
多用于函数内部的变量定义。定义后该变量只在该函数体内部生效。

特殊用法

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

    while read line; do         ##read 与用户交互命令 line是个变量可以自定义名称。
    循环体                         ##处理的内容为line这个变量的内容(文本中的一行)。
    done < /PATH/FROM/SOMEFILE  #使用标准输入重定向输入文档。

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

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




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

双小括号方法也可以使bash Shell实现C语言风格的变量操作
    #I=10
    #((I++))

for循环的特殊格式: help for

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

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

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

    条件判断表达式,可以写的非常简单。 i<=100即可

    括号内中的内容需要用分号隔开。

    例如for (( i=0;i<=100;i++));do
            let sum+=$i
        done
        echo "$sum"


for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.

Equivalent to
    (( EXP1 ))
    while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
    done
EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
omitted, it behaves as if it evaluates to 1.

Exit Status:
Returns the status of the last command executed.

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

(0)
yywyyw
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 20160808作业

    20160808作业 1、每日课堂笔记总结 2、预习 3、每日课堂pdf练习 1、删除/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符 [root@Centos7 ~]# sed '/^[[:space:]]\+/d' /etc/grub2.cfg  # # …

    Linux干货 2016-08-15
  • linux系统网络配置基础实例(网卡别名、bong、路由)

    概述:本文主要介绍网卡别名(一张网卡多个IP)、bonging(多张网卡绑定一个IP)、以及路由实验 Linux网络配置基础 基本网络配置 将Linux主机接入到网络,需要配置网络相关设置。一般包括如下内容:主机名:hostname示例:临时有效 [root@centos6 ~]# hostname MyHostName [ro…

    Linux干货 2016-09-06
  • 系统启动和内核管理以及几个重要实验

    Centos启动流程:     1.加载BIOS的硬件信息,获取第一个启动设备     2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息     3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 &n…

    Linux干货 2017-05-15
  • 第二十周作业

    一、用keepalived实现nginx与lvs的高可用集群 keepalived+nginx高可用环境:node1:    192.168.31.233     keepalived+nginx masternode2:    192.168.31.72      k…

    2017-07-22
  • Linux启动之GRUB详解

    GRUB 在BIOS读取先关信息之后,接下来就是去第一个可以启动的设备当中的MBR中读取Boot loader信息,bootloader具有菜单功能、直接加载内核信息,以及相关控制权限转交功能。所以说系统的启动必须有bootloader,然后才能去加载内核 grub:GRand Unified Bootloader  …

    Linux干货 2016-09-15
  • nginx+keepalived构建负载均衡代理服务器

    实验环境: 1、centos7.3 centos6.82、两台VS提供nginx代理和keepalived3、两台RS提供httpd服务并部署wordpress4、另外一台提供Mysql数据库服务 实验拓扑图: 拓扑图 实验步骤 1、在vs1(172.18.251.4)上配置,用yum安装keepalived和nginx yum install -y kee…

    Linux干货 2017-05-21