差别
这里会显示出您选择的修订版和当前版本之间的差别。
— | blog:shell:03_shell_cond_and_branch [2025/02/02 23:10] (当前版本) – 创建 - 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | # Shell 条件与分支 | ||
+ | |||
+ | ## 条件判断 | ||
+ | |||
+ | |||
+ | 1. 数字的判断 | ||
+ | |||
+ | ``` | ||
+ | [ int1 -eq int2 ] 两数相等为真 | ||
+ | [ int1 -ne int2 ] 两数不等为真 | ||
+ | [ int1 -gt int2 ] int1大于int2为真 | ||
+ | [ int1 -ge int2 ] int1大于等于int2为真 | ||
+ | [ int1 -lt int2 ] int1小于int2为真 | ||
+ | [ int1 -le int2 ] int1小于等于int2为真 | ||
+ | ``` | ||
+ | |||
+ | 2. 文件的判断 | ||
+ | |||
+ | ``` | ||
+ | [ -r file ] 用户可读为真 | ||
+ | [ -w file ] 用户可写为真 | ||
+ | [ -x file ] 用户可执行为真 | ||
+ | [ -f file ] 文件为正规文件为真 | ||
+ | [ -d file ] 文件为目录为真 ,即检测目录是否存在。 | ||
+ | [ -c file ] 文件为字符设备文件为真 | ||
+ | [ -b file ] 文件为块设备文件为真 | ||
+ | [ -s file ] 文件大小非0时为真 | ||
+ | [ -t file ] 当文件描述符(默认为1)指定的设备为终端时为真 | ||
+ | [ -e file ] 如果文件存在,则为真。 | ||
+ | [ -L file ] 如果文件为符号链接, 则为真。 | ||
+ | ``` | ||
+ | |||
+ | 3. 逻辑判断 | ||
+ | |||
+ | ``` | ||
+ | [ condition -a condition ] 与 | ||
+ | [ condition -o condition ] 或 | ||
+ | [ condition ! condition ] 非 | ||
+ | ``` | ||
+ | |||
+ | 4. 字符串判断 | ||
+ | |||
+ | 字符串的比较,最好使用双中括号 | ||
+ | |||
+ | ``` | ||
+ | 1. 判断字符串相等 | ||
+ | [[ " | ||
+ | 上面两种方式具备相同的功能 | ||
+ | |||
+ | [[ " | ||
+ | [[ " | ||
+ | [ " | ||
+ | 此时的a*会自动匹配到当前以a开头的文件 | ||
+ | 如果str=ab.txt, | ||
+ | [ " | ||
+ | | ||
+ | 2. 判断字符串不相等 | ||
+ | [[ " | ||
+ | |||
+ | 3. 判断字符串不为空,长度大于0 | ||
+ | [ -n " | ||
+ | |||
+ | 4. 判断字符串为空.就是长度为0. | ||
+ | [ -z " | ||
+ | |||
+ | ``` | ||
+ | |||
+ | ## test命令 | ||
+ | |||
+ | 基本格式: test expression | ||
+ | test命令返回真(0)或者假(1) | ||
+ | |||
+ | test命令可以理解的表达式类型分为4类 | ||
+ | * 表达式判断 | ||
+ | * 字符串比较 | ||
+ | * 数字比较 | ||
+ | * 文件比较 | ||
+ | |||
+ | 例如: | ||
+ | `if test $var -eq 0 等价于 if [ $var -eq 0 ]` | ||
+ | |||
+ | |||
+ | ## 分支与循环 | ||
+ | |||
+ | ### if条件 | ||
+ | |||
+ | 格式如下: | ||
+ | ``` | ||
+ | if condition; then | ||
+ | commands | ||
+ | fi | ||
+ | |||
+ | if condition; then | ||
+ | commands | ||
+ | elif condition; then | ||
+ | commands | ||
+ | else | ||
+ | commands | ||
+ | fi | ||
+ | ``` | ||
+ | 使用逻辑运算符简化语句 | ||
+ | |||
+ | ``` | ||
+ | [ condition ] && action | ||
+ | [ condition ] || action | ||
+ | ``` | ||
+ | |||
+ | ### Case语句 | ||
+ | |||
+ | 适用于需要进行多重分支的应用情况。 | ||
+ | 格式如下: | ||
+ | ``` | ||
+ | case $变量名 | ||
+ | 模式1 ) | ||
+ | 命令序列1 | ||
+ | ;; | ||
+ | 模式2 ) | ||
+ | 命令序列2 | ||
+ | ;; | ||
+ | *) | ||
+ | 默认执行的命令序列 | ||
+ | ;; | ||
+ | esac | ||
+ | ``` | ||
+ | |||
+ | case行尾必须为单词“in”,每一个模式必须以右括号“)”结束. | ||
+ | 双分号`;; | ||
+ | 匹配模式: | ||
+ | 可以使用方括号表示一个连续的范围,如[0-9]; | ||
+ | 竖杠符号`|`表示或. | ||
+ | `*)` 表示默认模式,当使用前面的各种模式均无法匹配该变量时, | ||
+ | |||
+ | ### for循环 | ||
+ | |||
+ | 格式如下: | ||
+ | ``` | ||
+ | for var in word1 word2 …… | ||
+ | do | ||
+ | command | ||
+ | command | ||
+ | …… | ||
+ | done | ||
+ | ``` | ||
+ | |||
+ | 例: | ||
+ | |||
+ | ``` | ||
+ | #!/bin/sh | ||
+ | for i in {1..10} | ||
+ | do | ||
+ | echo $i | ||
+ | done | ||
+ | ``` | ||
+ | 注意: | ||
+ | |||
+ | |||
+ | ### While循环 | ||
+ | |||
+ | 格式如下: | ||
+ | ``` | ||
+ | while condition | ||
+ | do | ||
+ | command | ||
+ | command | ||
+ | …… | ||
+ | done | ||
+ | ``` | ||
+ | 例: | ||
+ | |||
+ | ``` | ||
+ | #!/bin/sh | ||
+ | while [ $# -ne 0 ] | ||
+ | do | ||
+ | echo $1 | ||
+ | shift | ||
+ | done | ||
+ | ``` | ||
+ | shift使位置变量下移,使$1=$2, | ||
+ | |||
+ | |||