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

相关推荐

  • linux 常用命令

    命令1 rm 作用: 删除指定的文件  选项 作用 -f 强制删除 -i 删除前提示询问 -r  或  -R 递归处理,删除指定目录下的所有文件包括子目录 -v 显示指令执行过程 -d 直接把删除目录的硬连接数据删成零,删除该目录 命令2 终端(tty): 终端类型 开启方式 物理终端 console 控制台console 虚拟…

    Linux干货 2017-07-13
  • CentOS 6开机启动流程理论篇

    CentOS 6开机启动流程理论篇 centos 系统的启动流程 grub 破坏Linux的核心文件再修复体验系统启动流程 概述 任 何系统启动的第一步必然是加电,然后计算机硬件会主动地读取BIOS来加载硬件设备信息并检测,之后系统会主动地读取第一个有引导程序的设备,该引导程序 (grub)可以指定使用哪个内核来启动,并将其加载至内存当中运行,同时内核还要加…

    Linux干货 2016-09-19
  • PXE网络引导系统自动化安装CentOS7

     一.PXE 注意:安装前 selinux 禁用,iptables 关闭 dhcp 服务器静态IP地址  1.PXE的工作原理:      Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC  &nbsp…

    Linux干货 2017-07-24
  • 源码包编译安装

    程序包编译安装:      Application-VERSION-release.src.rpm–> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装      源代码 –> 预处理 –> 编译 &#8…

    Linux干货 2016-08-23
  • Hadoop伪分布式模型

    # java -version # vim /etc/profile.d/java.sh export JAVA_HOME=/usr # yum install java-1.8.0-openjdk-devel # mkdir /bdapps # tar xf hadoop-2.7.4.tar.gz -C /bdapps/ # cd /bdapps # ln…

    2017-12-08
  • n28 第二周作业

    n28 第二周作业

    Linux干货 2017-12-09