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

相关推荐

  • python面向对象第二周魔术方法详解

    魔法方法及其使用__开头和结束的方法,定义外部没有办法直接调用,但会有影响使用运算符号的魔法方法, + ,-,*,/,%,//,**, __add__,__sub__,__mul__,__truediv__,__mod__,__floordiv__,__pow__,__divmod__(?),系统内部对于数值型,字符串型,容器内型都定义了其中部分或者全部的运…

    Linux干货 2017-11-22
  • shell编程之循环

           当需要重复运行特定的指令以满足系统管理工作需要时,条件判断语句if、case并不能很好地提供支撑,shell提供了for、while、until循环语句来满足此需求。 一、for循环语句        for循环用于重复整个对象列表,依次遍历对列…

    Linux干货 2016-08-18
  • 高可用集群基本概念与heartbeat文本配置接口

    一、高可用集群基本概念:     什么是高可用集群:          所谓高可用集群,就是在出现故障时,可以把业务自动转移到其他主机上并让服务正常运行的集群构架     高可用集群的构架层…

    Linux干货 2016-01-13
  • 信息论的熵

    1.  前言    熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。    在信息论里则叫信息量,即熵是对不确定性的度量。从控制论的角度来看,应叫不确定性。信息论的创始人香农在其著作《通信的数学理论》中提出了建立在概率统计模型上的信息度量。他把信息定义为“用来消除不确定性的东西”。在信息世界,熵越…

    Linux干货 2016-03-27
  • N–25期 第九周作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash declare -i sumlogin=0 declare -i sumnologin=0 for i …

    Linux干货 2017-03-07
  • find文件查找

    文件查找      在文件系统上查找符合条件的文件:      实现工具:locate,find locate:      构建于实现构建好的索引库:/var/lib/mlocate/mlocate.db   &nbsp…

    Linux干货 2016-08-22