差别
这里会显示出您选择的修订版和当前版本之间的差别。
| — | 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, | ||
| + | |||
| + | |||