Shell Scripts 变量

  • 定义 - $ myname=zhe
  • 使用 - $ echo $myname
  • 只读 - $ readonly修饰变量
  • 删除 - $ unset myname
  • 变量类型:
    • 局部变量
    • 环境变量
    • Shell变量

Shell Scripts 字符串

  • ' ' 单引号

    • $ str='this is a string'
    • 单引号里内容原样输出,且不能获取变量值
    • 单引号里不能出现',对单引号进行转义也不行
  • " " 双引号

    • $ str="this is a string"
    • 双引号中可获取变量的值
    • 双引号中允许转义
  • 字符串处理

    • $ echo ${#str} - 获取str长度
    • $ echo ${str:1:4} - 获取子字符串(索引1-4)

Shell Script数组

  • 定义数组

    • 数组表示:(), 数组元素用 空格 隔开
    • $ array_test=(v1 v2 v3)
    • 亦可定义数组各个分量: $ array_test[0]=lalala
  • 读取数组

    • Usage: ${array_name[index]}
      • $ ${array_test[1]}- 输出v2
    • 获取所有元素: @
      • $ ${array_test[@]}
    • 获取数组长度:
      • $ ${#array_test[@]} | $ ${#array_test[*]}

Shell Scripts 参数

脚本获取参数格式: $n,n 为整数

  • $0 —获取脚本执行的文件名
  • $1 —获取脚本执行的第一个参数
  • $2 —获取脚本执行的第二个参数

  • Options

    • $# - 获取传递参数个数
    • $* - 以一个单字符串显示所有传入给脚本的参数
    • $@ - 使用时加引号,且在引号中显示所有参数(“$1”,“$2”,“$3”)
    • $* & $@ 的区别
      • 都是引用所有参数
      • 在双引号中的显示结果不同

Shell Scripts 运算

算数运算符

原生bash不支持数学运算,通过使用 expr 表达式工具完成

注:

  • 表达式和运算符之间有空格:`val=expr 2 + 2`
  • 完整的表达式要被 (反引号)包含
  • * 必须加 \ 才能实现运算
  • a=10; b=20
  • +, -, *, /, %, =
    • `expr $a + $b` = 30
  • ==, !=
    • 条件表达式必须用 []-方括号, 且要有空格
    • [ $a == $b ]

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串是数字; 结果为bool型

  • a=10; b=20
  • eq 相等
    • [ $a -eq $b ], return false
  • nq 不相等
  • gt 大于
  • lt 小于
  • ge 大于等于
  • le 小于等于

逻辑运算符

  • && 逻辑 And
  • || 逻辑 Or

布尔运算符

  • -a 与
  • -o 或
  • ! 非

字符串运算符

a=“www”; b=“google”

  • = 检测两个字符串是否相等,相等返回 true
    • ==  一般用两个等号来判断,其结果和一个等号的相同
    • [ $a = $b ], return false
    • [ $a == $b ], return false
  • != 检测两个字符串是否相等,不相等返回 true
  • -z 检测字符串长度是否为0,为0返回 true
    • [ -z $a ], return false
  • -n 检测字符串长度是否为0,不为0返回 true
  • str 检测字符串是否为空,不为空返回 true
    • [ $a ], return true

文件测试运算符

检测unix文件的各种属性

  • -b .块
  • -c .字符
  • -d .目录
  • -f .普通
  • -r .可读
  • -w .可写
  • -x .可执行
  • -s .文件为空
  • -e .文件或目录是否存在
  • -g, -k, -p, -u

Shell Scripts 条件

if ... then ... fi

  • 单层

    1
    2
    3
    4
    
    if [condition]; then    
        command1     
        command2     
    fi  
  • 多重

    1
    2
    3
    4
    5
    
    if [condition]; then
        command1
    else
        command2
    fi
  • 多重复杂

    1
    2
    3
    4
    5
    6
    7
    
    if [condition1]; then
        command1
    elif [condition2]; then
        command2
    else
        command3
    fi

case ... in ... esac

  • 语法格式

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    case $variable_1 in     # 关键字case, 变量前有$
        "variable_value")   # 变量_1_值
            command1        # 变量_1 的程序段
            command2
        ;;                  # 该类别结束
    
        "variable_value")   # 变量_2_值
            command3        # 变量_2 的程序段
        ;;                  # 该类别结束
    
        *)                  # 用 * 代替其他所有值
            command4
        ;;
    esac

Shell Scripts 循环

for...do...done

  • 语法格式

    1
    2
    3
    4
    5
    
    for var in item1 item2 ... itemn
    do
        command1
        command2
    done

while...do...done

  • 当 condition 条件为真时,开始循环

    1
    2
    3
    4
    5
    6
    
    while [condition]   # 中括号为测试条件
    do                  # 循环开始
        command1        # 循环执行体
        command2
        ...
    done                # 循环结束

until...do...done

  • 当 condition 条件为真时,停止循环,

    1
    2
    3
    4
    5
    6
    
    1. until [condition]
    2. do 
        1. command1
        2. command2
        3. ...
    3. done

说明:

  • 测试发生在循环末尾,因此 until 循环体至少执行一次

dead loop

  • First

    1
    2
    3
    4
    5
    
    while :
    do 
        command1
        command2
    done
  • Second

    1
    2
    3
    4
    
    while true
    do
        command
    done
  • Third

    1
    
    for (( ; ; ))

jump loop

  • break
    • 终止所有循环
  • continue
    • 终止当前循环,进入下一次循环

Shell Scripts 函数

  • 函数语法

    1
    2
    3
    4
    5
    6
    
    function func_name () {
        command1
        command2
        ...
        return int  # 返回可以不加,也可以显示的添加
    }

    说明:

    • 函数必须在使用前定义,即放在脚本最开始; 使用函数名来调用函数
    • 参数返回可以显示加 return int(int取值 0-255 ) 返回; 如果不加将以最后一条命令运行结果作为返回值
    • 函数返回值通过 $? 来获取
  • 函数参数

    函数参数和脚本参数获取方式一样:即在函数内部通过 $n 的形式获取参数值, $1-第一个参数, $2-第二个参数

    说明:$0 —依旧获取脚本执行的文件名

Shell Scripts 文件包含

语法格式

  • 格式一
    • . filename
    • 点号 . 和文件名间有空格
  • 格式二
    • source filename

Shell Scripts 追踪与调试

  • sh -[nvx] scripts.sh

    • n - 不执行script,只检查语法错误
    • v - 在执行script前,先将script内容输出到屏幕上
    • x - 将使用到的script内容输出到屏幕上

Shell Scripts 常用用法

See Also

Thanks to the authors 🙂