shell中if-then的高级使用
作者:静听山水
在 Shell 脚本中,if-then
语句是最基本的逻辑控制结构之一,用于根据条件执行不同的代码块。以下是关于 if-then
语句的基本结构、语法以及一些示例。
基本语法
if 条件表达式; then # 当条件表达式为真时执行的命令 命令1 命令2 ... else # 当条件表达式为假时执行的命令 命令A 命令B ... fi
详细解释
if
关键字:if
关键字开始一个条件判断。
条件表达式:
- 条件表达式可以是关系表达式、逻辑表达式或其他任何形式的布尔表达式。
- 条件表达式通常放在圆括号
()
中,以提高可读性和避免解析错误。
then
关键字:then
关键字表示条件表达式之后的代码块开始。
命令块:
- 当条件表达式为真时,执行
then
后面的命令块。
- 当条件表达式为真时,执行
else
关键字(可选):else
关键字表示当条件表达式为假时执行的代码块。else
块是可选的,如果不需要处理条件为假的情况,可以省略。
fi
关键字:fi
关键字结束整个if
语句。
示例
示例 1:基本用法
#!/bin/bash # 获取用户输入 read -p "请输入一个数字: " num # 判断数字是否大于10 if [ "$num" -gt 10 ]; then echo "数字大于10" else echo "数字小于或等于10" fi
示例 2:使用逻辑运算符
#!/bin/bash # 获取用户输入 read -p "请输入一个数字: " num # 判断数字是否在1到10之间 if [ "$num" -ge 1 ] && [ "$num" -le 10 ]; then echo "数字在1到10之间" else echo "数字不在1到10之间" fi
示例 3:嵌套 if-then 语句
#!/bin/bash # 获取用户输入 read -p "请输入一个数字: " num # 判断数字是否为正数、负数还是零 if [ "$num" -gt 0 ]; then echo "数字是正数" elif [ "$num" -lt 0 ]; then echo "数字是负数" else echo "数字是零" fi
条件表达式
1. 数值比较
# 比较数值 [ "$num" -eq 10 ] # 等于 [ "$num" -ne 10 ] # 不等于 [ "$num" -gt 10 ] # 大于 [ "$num" -lt 10 ] # 小于 [ "$num" -ge 10 ] # 大于或等于 [ "$num" -le 10 ] # 小于或等于
2. 字符串比较
# 比较字符串 [ "$str" = "hello" ] # 等于 [ "$str" != "hello" ] # 不等于 [ "$str" \< "hello" ] # 字典序小于 [ "$str" \> "hello" ] # 字典序大于
3. 文件测试
# 测试文件属性 [ -f "$file" ] # 是普通文件 [ -d "$file" ] # 是目录 [ -r "$file" ] # 可读 [ -w "$file" ] # 可写 [ -x "$file" ] # 可执行 [ -s "$file" ] # 文件非空
示例 4:文件测试
#!/bin/bash # 获取用户输入的文件名 read -p "请输入一个文件名: " filename # 测试文件是否存在且为普通文件 if [ -f "$filename" ]; then echo "文件存在且为普通文件" else echo "文件不存在或不是普通文件" fi
bash shell还提供了3个可在if-then语句中使用的高级特性。
- 在子shell中执行命令的单括号。
- 用于数学表达式的双括号。
- 用于高级字符串处理功能的双方括号。
接下来将详细描述各个特性。
使用单括号
单括号允许在if语句中使用子shell。单括号形式的test命令格式如下:
(command)
在bash shell执行command之前,会先创建一个子shell,然后在其中执行命令。如果命令成功结束,则退出状态码会被设为0,then部分的命令就会被执行。如果命令的退出状态码不为0,则不执行then部分的命令。来看一个使用子shell进行测试的例子:
$ cat SingleParentheses.sh #!/bin/bash # Testing a single parentheses condition # echo $BASH_SUBSHELL # if (echo $BASH_SUBSHELL) then echo "The subshell command operated successfully." # else echo "The subshell command was NOT successful." # fi $ $ ./SinglePArentheses.sh 01 The subshell command operated successfully.
当脚本第一次(在if语句之前)执行echo $BASH_SUBSHELL命令时,是在当前shell中完成的。该命令会输出0,表明没有使用子shell。在if语句内,脚本在子shell中执行echo $BASH_SUBSHELL命令,该命令会输出1,表明使用了子shell。子shell操作成功结束,接下来是执行then部分的命令。
警告 当你在if test语句中使用进程列表时,可能会出现意料之外的结果。哪怕进程列表中除最后一个命令之外的其他命令全都失败,子shell仍会将退出状态码设为0,then部分的命令将得以执行。
对脚本略作修改,来看一个在子shell中执行失败的例子:
$ cat SingleParentheses.sh #!/bin/bash # Testing a single parentheses condition # echo $BASH_SUBSHELL # if (cat /etc/PASSWORD) then echo "The subshell command operated successfully." # else echo "The subshell command was NOT successful." # fi $ $ ./SinglePArentheses.sh cat: /etc/PASSWORD: NO such file or directory The subshell command was NOT successful.
因为子shell中的命令指定了错误的文件名,所以退出状态码被设为非0。接下来则执行else部分的命令。
使用双括号
双括号命令允许在比较过程中使用高级数学表达式。test命令在进行比较的时候只能使用简单的算术操作。双括号命令提供了更多的数学符号,这些符号对有过其他编程语言经验的程序员而言并不陌生。双括号命令的格式如下:
((expression))
expression可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,表还列出了双括号中可用的其他运算符。
双括号命令符号
符号 | 描述 |
---|---|
val++ | 后增 |
val-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔AND |
| | 位布尔OR |
&& | 逻辑AND |
|| | 逻辑OR |
双括号命令既可以在if语句中使用,也可以在脚本中的普通命令里用来赋值:
$ cat DoubleParentheses.sh #!/bin/bash # Testing a double parentheses command # val1=10 # if (( $val1 ** 2 > 90 )) then (( val2 = $val1 ** 2 )) echo "The square of $val1 is $val2," echo "which is greater than 90." # fi $ $ ./DoubleParentheses.sh The square of 10 is 100, which is greater than 90.
注意,双括号中表达式的大于号不用转义。这是双括号命令又一个优越性的体现。
使用双方括号
双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:
[[ expression ]]
expression可以使用test命令中的标准字符串比较。除此之外,它还提供了test命令所不具备的另一个特性——模式匹配。
注意 双方括号在bash shell中运行良好。不过要小心,不是所有的shell都支持双方括号。
在进行模式匹配时,可以定义通配符或正则表达式来匹配字符串:
$ cat DoubleBrackets.sh #!/bin/bash # Using double brackets for pattern matching # # if [[ $BASH_VERSION == 5.* ]] then echo "You are using the Bash Shell version 5 series." fi $ $ ./DoubleBrackets.sh You are using the Bash Shell version 5 series.
上述脚本中使用了双等号(==)。双等号会将右侧的字符串(5.*)视为一个模式并应用模式匹配规则。双方括号命令会对$BASH_VERSION环境变量进行匹配,看是否以字符串5.起始。如果是,则测试通过,shell会执行then部分的命令。
总结
if-then
语句是 Shell 脚本中最基本的逻辑控制结构之一,用于根据条件执行不同的代码块。通过组合不同的条件表达式和逻辑运算符,可以实现复杂的逻辑判断。
到此这篇关于shell中if-then的高级使用的文章就介绍到这了,更多相关shell if-then内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!