# 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. 判断字符串相等 [[ "$str1" = "$str2" ]] 或者 [[ "$str1" == "$str2" ]] 上面两种方式具备相同的功能 [[ "$str" == a* ]] 模式匹配, 如果字符串以a开头,则条件为true [[ "$str" == "a*" ]] 如果字符串和"a*"相等,则条件为true [ "$str" == a* ] file globbing(文件通配) 此时的a*会自动匹配到当前以a开头的文件 如果str=ab.txt,并且当前目录中存在ab.txt这个文件,那么上面的条件将会满足 [ "$str" == "a*" ] 如果字符串和"a*"相等,则条件为true 2. 判断字符串不相等 [[ "$str1" != "$str2" ]] 3. 判断字符串不为空,长度大于0 [ -n "$str1" ] 4. 判断字符串为空.就是长度为0. [ -z "$str1" ] ``` ## 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 [ condition ] || action 如果condition为假,则执行action ``` ### Case语句 适用于需要进行多重分支的应用情况。 格式如下: ``` case $变量名 in 模式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 ``` 注意: 大括号与数字之间不能有空格,上面的脚本i从1到10,中间使用2个点表示, 数字与点之间不能有空格 ### While循环 格式如下: ``` while condition do command command …… done ``` 例: ``` #!/bin/sh while [ $# -ne 0 ] do echo $1 shift done ``` shift使位置变量下移,使$1=$2,$2=$3,最后$#还要减少1,也就是说把第一个参数删除了