• Shell 编程


      Shell 是一门脚本语言(又称解释型语言),Shell 其实就是一个纯文本文件,通常以【#!/bin/bash】开始。脚本自上而下,从左至右分析并执行,其中【#】后面的为注释。脚本有以下几种运行方式:(1) 【bash shell.sh】 (2)【sh shell.sh】(3)【./shell.sh】当前目录下执行,用户必须有可执行权限 (4)【. ./shell.sh】或【source shell.sh】无执行权限也能执行,【source】一般用于读取配置文件使其立即生效。

    第一个 Shell 脚本:

    #!/bin/bash
    # show Hello World
    # 2016-06-06 cyhe
    echo "Hello World"
    exit 0

    1. 变量

      在Shell中,变量是弱类型的(存放各类数据,比如文件名,路径名等),而且无论值是否加引号,默认都是字符串。变量名只能以字母或下划线开头,并且区分大小写,长度无限制。变量分为局部变量和环境变量。当登陆 Linux取得一个交互Shell后,我们可以在这个 Shell(父Shell) 中管理系统、创建 子Shell、定义变量。子Shell 能够继承 父Shell 的环境变量,不会继承自定义变量,在Shell 可以使用【export】将自定义变量上升为环境变量,供子程序使用。

    (1)局部变量

      局部变量的作用域在 Shell 内部,其他shell不能访问,随脚本结束而消亡。可以使用 local 可以显式声明局部变量,常用于函数内部。

    (2)环境变量

      环境变量又称为全局变量,Shell 中变量默认就是全局的。为了有一个较好的执行环境,在编写 Shell 之前可以先设置好一些重要的环境变量,比如PATH,LANG,可以方便的下达一些命令,而不必使用绝对路径。比如,在使用 crontab 定期执行脚本自动备份Oracle数据库(或其他)时,Oracle相关的环境变量(ORACLE_HOME, NLS_LANG…)一般在oracle用户下,此时脚本不使用 export 声明Oracle相关变量,将不能执行。

    (3)变量的赋值与取值

    #!/bin/bash
    # 变量名=值(var=value 等号两边没有空格),使用 【$var/${var}】 符号取值
    # 如果有空格就必须使用引号
    name=cyhe
    name="cy he"
    echo $name
    echo ${name}

    Shell 中预定义的特殊变量和特殊字符:

    变量 说明
    $0 脚本名称
    $n 脚本或函数参数,$1 第一个参数,$2 第二个以此类推
    $? 脚本或命令返回值
    $*,$@ 显示所有参数
    通配符 *:任意长度字符串,不包括点号和斜线
    ?:匹配单一字符
    []:匹配其中的任一个
    ‘’ 单引号:强引用,作为普通字符处理
    “” 双引号:解析字符串里的【$,,`】特殊用途
    # 注释
    $(命令) 可以把命令的输出赋值给变量,支持嵌套
     ; 分号,执行多个命令,# date; ls -l

     

    2. 算术运算

    Shell 只支持整数计算

    命令 用法
    let #!/bin/bash
    a=1
    b=2
    let c=a+b
    自增 let a++
    自减 let a--
    [ ] c=$[a+b] 或 c=$[ $a+2 ]
    取模 $[5%2]  幂运算 $[2**3]
    (()) c=$(( a+b )),c=$(( (5+2)*3 )),(( a++ )) 常用
    bc 高精度计算语言,支持比较运算和逻辑运算

     

    3. 数组

      在 shell 中,数组中元素类型可以不同,数组的长度也不限制,可以随时随地增加数组元素,但是只支持一维数组,使用整数作索引,也可以使用字符串作索引。

    #!/bin/bash
    # 数组相关操作
    # author: cyhe 2016-11-08
    nums=(1 2 3 4 5)  # 定义数组
    weeks=("sun" "mon" "thu")
    weeks[3]="wed"    # 随时随地增加数据 
    weeks[4]="thur"
    echo ${#weeks[@]} # 数组长度 or ${#weeks[*]}
    echo ${#weeks[4]} # 数组元素的长度
    echo ${weeks[@]}  # 数组所有元素
    echo ${weeks[0]}  # 取第 0 个元素
    unset weeks[1]    # 取消第 1 个元素

    4. 判断

      在编程时,会经常根据字符串是否为空,文件是否存在诸如此类的问题,来控制程序的流程,在 Shell 中可以使用【test expression】命令直接测试。此外可以利用判断符号【[ ](中括号)】进行数据的判断,在使用中括号有几个关键的地方:括号内的每个元素都要用空格分隔;括号内的变量,最好都用双引号括起来;括号内容的常量,最好都用单或双引号括起来。常与 if 语句搭配使用

    常用测试判断条件

    标志 说明
    1. 文件类型 [ –e filename ]
    -e 文件是否存在
    -f 文件是否存在且为文件(file)
    -d 文件是否存在且为目录(directory)
    2. 文件权限 [ –r filename ]
    -r/w/x 文件是否存在且有相应的权限
    -s 文件是否存在且为非空白文件
    3. 比较文件 [ file1 -nt file2 ]
    -nt/-ot 判断file1是否比file2新(new than)/旧(older than)
    -ef 是否为同一文件
    4. 比较整数 [ n1 -eq n2 ]
    -eq/-ne 相等(equal)/不相等(not equal)
    -gt/-lt 大于(greater than)/小于(less than)
    -ge/-le 大于等于/小于等于
    5. 判断字符串  
    [ –z string ] 是否为空
    [ –n string ] 是否不空
    [ str1 == str2 ] 是否相等
    [ str1 != str2 ] 是否不等
    6. 逻辑运算  
    -a and,[ –r file –a –x file ],同时有rx权限
    -o or,[ –r file –o –x file ],有r或x权限
    ! 非,[ ! –x file ],不具有x权限
    && 与,[ –r file ] && [ –x file ]
    || 或,[ –r file ] || [ –x file ]
    非,! [ –e file ]

     

    【if/else判断】

    #!/bin/bash
    str="Hello World"
    file=/opt/shell.log
    # 单层条件判断 这里分号的作用是连续执行命令,不用换行了
    if [ -z "$str" ]; then # 若字符串为空
        # TODO
    fi
    # 一个分支
    if [ -f "$file" ]; then # 文件是否存在
        # TODO
    else
        # TODO
    fi
    
    # 多个分支
    if [ -z "$1" ]; then # 若第一个参数为空
        # TODO
    elif [ "$1" == "" ]; then # 是否为空串
        # TODO
    else
        # TODO
    fi

    【case … esac判断】

    #!/bin/bash
    case $1 in
        "start")        # 第一个变量内容,关键字右小括号
           echo "start"
           ;;           # 该程序段结束
        "stop")
           echo "start"
           ;;
        "restart")
           echo "stop"
           echo "start"
           ;;
        *)              # 默认匹配
           echo "Usage: $0 {start|stop|restart}" 
           exit 1
           ;;
    esac                # 结束

    5. 循环

    【for 循环】

    #!/bin/bash
    # 1. 用来遍历
    nums=(1 2 3 4 5);sum=0
    for n in ${nums[@]} # 遍历数组求和
    do
        sum=$(($sum + $n))
    done
    # 遍历 1-5 的数字
    for n in {1..5} # 或1 2 3 4 5 或$(seq 1 5)
    do
        echo $n
    done
    # 2. 带条件的for循环,求1-100的和
    sum=0
    for (( i=0; i<=100; i++ ))
    do
        sum=$(( $sum+$i )) # 或 let sum=sum+i
    done
    # 死循环
    for ((;1;))
    

    【while 循环】

    #!/bin/bash
    while [ condition ]
    do
     # TODO
    done
    # while一个经典用法,按行读取文件
    cat foo.txt | while read line # 运行时产生 3 个shell:cat,管道,while
    do
        echo $line
    done
    # 死循环
    while true
    while 1

    6. 函数

      函数就是自定义的一系列执行命令,一般设置返回值(0正确,非0错误),最主要还是用来代码复用。

    #!/bin/bash
    # 1. 函数定义与返回值
    function fun_name(){ # function 关键字可省略
        # TODO
        echo $@  # 打印所有参数 无输出 0
        return 0
    }
    fun_name # 函数调用,只调用函数名即可
    echo $?  # 取函数返回值,可赋值给变量
    # 2. 参数
    # fun_name arg1 arg2 ...
    fun_name a b c
    # 3. 变量
    # shell中变量默认是全局的,可使用 local 定义局部变量
    n=5
    fun(){
        local n=1
        let n++
    }
    fun # 调用函数不影响 n 的值
    echo $n
    # $0 代表函数名 $1 第一个参数 $2 第二个 一次类推
    # 这里的参数与脚本本身的参数 毫无关系

    7. 调试脚本debug

     sh –n shell.sh  检查语法问题,不执行脚本

     sh –v shell.sh   执行前先输出脚本内容到屏幕

     sh –x shell.sh   将脚本执行过程输出到屏幕

    作 者:创心coder
    QQ群:361982568
    订阅号:cxcoder
    文章不足之处,还请谅解!本文会不断完善更新,转载请保留出处。如果帮到了您,烦请点赞,以资鼓励。
  • 相关阅读:
    查找网页元素对应的js代码
    29 图片缩小案例
    29 三级缓存案例
    [Angular2]eclipse中angular2开发环境的搭建
    28 自定义View流式布局
    28 自定义滑动开关
    28 自定义View侧滑栏
    28自定义View 模仿联系人字母侧栏
    28 自定义View画坐标和柱状图
    JFinal中使用QuartzPlugin报ClassCastException解决方法
  • 原文地址:https://www.cnblogs.com/cwane/p/6042855.html
Copyright © 2020-2023  润新知