zoukankan      html  css  js  c++  java
  • shell 简单脚本编程

    shell脚本编程
    编译器,解释器

    编程语言: 机器语言,汇编语言,高级语言

    静态语言:编译型语言
    强类型(变量)
    事先转换成可执行格式
    C,C++,JAVA,C#


    动态语言:解释型语言,on the fly
    弱类型
    边解释边执行
    ASP,ASP.NET,PHP,SHELL,PYTHON,PERL


    shell: 弱类型编程语言
    强类型: 变量在使用前,必须事先声明,甚至需要初始化
    弱类型: 变量用时声明,甚至不区分类型

    bash变量类型:
    环境变量:作用域为当前shell进程及其子进程
    export name=value
    或者name = value
    export name
    "导出"
    脚本在执行时会启动一个子shell进程:
    命令行中启动的脚本会继承当前的shell环境变量
    系统自动执行的脚本(非命令行启动)就需要自我定义需要的各环境变量


    本地变量(局部变量):
    引用变量:${变量名},括号可省略。变量替换 强引用 用"" 双引号
    set name=value : 作用域为整个bash进程
    局部变量:
    local name=value ,作用域为当前代码段:

    撤销变量
    unset name

    查看当前shell 中的变量: set(查看所有变量)

    查看当前shell 中得环境变量
    printenv
    env
    export

    位置变量
    $1, $2....
    特殊变量(系统变量)
    $? : 上一个命令执行状态返回值;


    程序执行:可能有两个状态返回值
    程序执行结果
    程序返回代码 (0-255)
    0 : 正确执行
    1-255:错误执行
    1,2,127为系统预留执行返回代码


    /dev/null : 软件设备, bit bucket , 数据黑洞


    脚本:
    命令的堆砌,按照实际需要,结合命令流程控制机制实现的源程序
    shebang: 魔数
    #/bin/bash 指明执行的脚本执行路径
    # 注释行,不执行

    变量追加
    name=aaaa
    echo $name
    name=$name:bbb
    echo name
    完成变量的内容追加,类似数组添加元素



    条件判断:
    bash中,如何实现条件判断?
    条件测试类型:
    整数测试:
    字符测试:
    文件测试:

    条件测试的表达式:
    [ expression ] : []两端必须要有空格 命令测试法
    [ [expression] ] 关键字测试法
    test expression

    如:
    INT1=55
    INT2=65
    [ $INT1 -eq INT2 ]
    [ [ $INT1 -eq INT2 ] ]
    test $INT1 -eq INT2


    整数比较:
    -eq : 是否相等 $A -eq $B
    -ne : 是否不等: 不等为true,否则为false。
    -gt : 大于
    -lt : 小于
    -ge : 大于或等于
    -le : 小于或等于


    命令间的逻辑关系:
    逻辑与: &&
    第一个条件为假时,第二条件不再判断,最终结果已有:
    第一个条件为真时,第二条件必须判断

    逻辑或: ||


    编程风格——>> 变量名称:
    1 只能包含字母,数字和下划线,并且不能以数字开头。
    2 不能跟系统中已有的环境变量重名。
    3 最好见名知意

    条件判断: 控制结构
    单分支if 语句:

    if 判断条件; then
    statement 1
    statement 2
    statement 3
    ...
    fi

    双分支if 语句:
    if 判断条件;then
    statement 1
    statement 2
    statement 3
    ..
    else
    statement 4
    statement 5
    ...
    fi



    shell中的算术运算:
    A=3,B=6
    1 let 算术运算表达式
    let C =$A+$B
    2 $[ 算术运算表达式]
    C =${$A+$B}

    3 $((算术运算表达式))
    C = $(($A+$B))

    4 expr 算术运算表达式, 表达式中各操作数及运算符之间要有空格,并且要使用命令引用
    C = `expr $A + $B `




    文件测试:
    - e FILE(文件名或者文件路径) : 测试文件是否存在 isexit
    - f FILE : 测试文件是否为普通文件
    - d FILE :测试指定路径是否为目录
    - r FILE : 测试当前用户对指定路线是否可读。
    - w FILE : 测试当前用户对指定路线是否可写。
    - x FILE : 测试当前用户对指定路线是否可执行。

    [ -e /etc/inittab ]


    测试脚本是否有语法错误
    bash - n 脚本
    bash - x 脚本 逐步展示执行过程


    定义脚本退出状态码:
    exit : 退出脚本(后面跟上需要的状态码)
    如果脚本没有明确定义退出状态码,那么最后执行的一条命令的突出码即为脚本的退出码。
    exit 0-255

    bash的变量类型
    本地变量(局部变量)
    环境变量
    位置变量:
    $1,$2.... (参数位置)
    shift: 参数轮替,后面跟数字,实现轮替的步进
    ./file.sh /etc/inittab /etc/test
    $1: /etc/inittab
    $2: /etc/test
    特殊变量:
    $? : 上一条命令的退出状态码
    $# : 参数的个数
    $* : 参数列表
    $@ : 参数列表

    字符测试:
    ==:测试是否相等,相等为真,不等为假
    !=: 测试是否不等,不等为真,等为假
    >
    <
    -n string: 测试指定字符串是否为空,空则真,不空则假
    -z string: 测试指定字符串是否不空,不空为真,空则为假

    #!/bin/bash
    #
    if [ $1 = 'q' ];then
      echo "Quiting..."
      exit 1
    elif [ $1 = 'Q' ];then
      echo "Quiting..."
      exit 2  
    elif [ $1 = 'quit' ];then
      echo "Quiting..."
      exit 3 
    elif [ $1 = 'Quit' ];then
      echo "Quiting..."
      exit 4  
    else
      echo $1
    fi

    循环:进入条件,退出条件
    for
    while
    until

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

    for I in 1 2 3 4 5 6 7 8 9 10; do
    加法运算
    done

    遍历完成之后,退出;

    如何生成列表:
    {1..100}
    `seq [起始数 [步进长度]] 结束数`


    1,...,100

    declare -i SUM=0
    integer
    -x

    计算100以内所有奇数的和以及所有偶数的和;分别显示之;
    
    let I=$[$I+1]
    SUM=$[$SUM+$I]
    
    let SUM+=$I
    
    let I+=1 相当于 let I++
    
    -=
        let I-=1 相当于 let I--
        
        ++I, --I
    
    写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:
    BASH,3users,they are:
    root,redhat,gentoo
    
    NOLOGIN, 2users, they are:
    bin,ftp
    
    
    #!/bin/bash
    #
    NUMBASH=`grep "bash$" /etc/passwd | wc -l`
    BASHUSERS=`grep "bash$" /etc/passwd | cut -d: -f1`
    BASHUSERS=`echo $BASHUSERS | sed 's@[[:space:]]@,@g'`
    
    echo "BASH, $NUMBASH users, they are:"
    echo "$BASHUSERS

    测试:
    整数测试
    -le
    -lt
    -ge
    -gt
    -eq
    -ne
    字符测试
    ==
    !=
    >
    <
    -n
    -z
    文件测试
    -e
    -f
    -d
    -r
    -w
    -x

    if [ $# -gt 1 ]; then

    组合测试条件
    -a: 与关系
    -o: 或关系
    !: 非关系

    if [ $# -gt 1 -a $# -le 3 ]
    if [ $# -gt 1 ] && [ $# -le 3 ]

    q, Q, quit, Quit


  • 相关阅读:
    On the fly test
    Spec Explorer 工具学习
    C# Static修饰符的作用
    [转]C#静态方法与非静态方法的比较
    如何获取网站服务器运行状态
    C#快速整理代码格式
    UI auto程序结构组织方式
    TestClass必须是public的
    VS2012如何显示行号
    Error: member names cannot be the same as their enclosing type
  • 原文地址:https://www.cnblogs.com/thelovelybugfly/p/10777219.html
Copyright © 2011-2022 走看看