shell脚本 学习笔记

作者 zhenlanghuo 日期 2018-07-15
shell脚本 学习笔记

变量

  • 定义变量

    my_name="zhenlanghuo"       #变量名和等号之间不能有空格
    for file in `ls /etc` #用for语句给变量赋值
  • 使用变量

        echo $your_name     
    echo ${your_name} #加花括号可以帮助解释器识别变量的边界

参数的传递

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

几个特殊字符:

字符 说明
\$# 传递到脚本的参数个数
\$* 以一个单字符串显示所有向脚本传递的参数。如”\$*“用「”」括起来的情况、以”\$1 \$2 … \$n”的形式输出所有参数。
\$\$ 脚本运行的当前进程ID号
\$! 后台运行的最后一个进程的ID号
\$\@ 与\$*相同,但是使用时加引号,并在引号中返回每个参数。如”\$\@”用「”」括起来的情况、以”\$1” “\$2” … “\$n” 的形式输出所有参数。
\$- 显示Shell使用的当前选项,与set命令功能相同。
\$\? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

运算符

  • 算数运算符

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用

    假定变量 a 为 10,变量 b 为 20:

    | 运算符 | 说明 | 举例 |
    | —— | ——————————————— | ——————————— |
    | + | 加法 | `expr \$a + \$b` 结果为 30。 |
    | - | 减法 | `expr \$a - \$b` 结果为 -10。 |
    | * | 乘法 | `expr \$a \* \$b` 结果为 200。 |
    | / | 除法 | `expr \$b / \$a` 结果为 2。 |
    | % | 取余 | `expr \$b % \$a` 结果为 0。 |
    | = | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
    | == | 相等。用于比较两个数字,相同则返回 true。 | [ \$a == \$b ] 返回 false。 |
    | != | 不相等。用于比较两个数字,不相同则返回 true。 | [ \$a != \$b ] 返回 true。 |

    注意:

    • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2

    • 完整的表达式要被 ` ` (反引号)包含,而不是单引号

    • 条件表达式要放在方括号之间,并且要有空格,例如: [\$a==\$b] 是错误的,必须写成 [ \$a == \$b ]

  • 关系运算符

    假定变量 a 为 10,变量 b 为 20:

    | 运算符 | 说明 | 举例 |
    | —— | —————————————————– | —————————- |
    | -eq | 检测两个数是否相等,相等返回 true。 | [ \$a -eq \$b ] 返回 false。 |
    | -ne | 检测两个数是否不相等,不相等返回 true。 | [ \$a -ne \$b ] 返回 true。 |
    | -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ \$a -gt \$b ] 返回 false。 |
    | -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ \$a -lt \$b ] 返回 true。 |
    | -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ \$a -ge \$b ] 返回 false。 |
    | -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ \$a -le \$b ] 返回 true。 |

  • 布尔运算符

    假定变量 a 为 10,变量 b 为 20:

    | 运算符 | 说明 | 举例 |
    | —— | ——— | ——————————————- |
    | && | 逻辑的AND | [[ \$a -lt 100 && \$b -gt 100 ]] 返回 false |
    | || | 逻辑的OR | [[ \$a -lt 100 || \$b -gt 100 ]] 返回 true |

  • 字符串运算符

    假定变量 a 为 “abc”,变量 b 为 “efg”:

    | 运算符 | 说明 | 举例 |
    | —— | —————————————– | ————————– |
    | = | 检测两个字符串是否相等,相等返回 true。 | [ \$a = \$b ] 返回 false。 |
    | != | 检测两个字符串是否相等,不相等返回 true。 | [ \$a != \$b ] 返回 true。 |
    | -z | 检测字符串长度是否为0,为0返回 true。 | [ -z \$a ] 返回 false。 |
    | -n | 检测字符串长度是否为0,不为0返回 true。 | [ -n “$a” ] 返回 true。 |
    | str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |

  • 文件测试运算符

    | 操作符 | 说明 |
    | ——- | ————–|
    | -b file | 检测文件是否是块设备文件,如果是,则返回 true。 |
    | -c file | 检测文件是否是字符设备文件,如果是,则返回 true。 |
    | -d file | 检测文件是否是目录,如果是,则返回 true。 |
    | -f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
    | -g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 |
    | -k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
    | -p file | 检测文件是否是有名管道,如果是,则返回 true。 |
    | -u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 |
    | -r file | 检测文件是否可读,如果是,则返回 true。 |
    | -w file | 检测文件是否可写,如果是,则返回 true。 |
    | -x file | 检测文件是否可执行,如果是,则返回 true。 |
    | -s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
    | -e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 |