blog:shell:03_shell_cond_and_branch

差别

这里会显示出您选择的修订版和当前版本之间的差别。


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. 判断字符串相等
 +    [[ "$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,也就是说把第一个参数删除了
 +
 +