前言
在 Linux Shell 脚本中,if 语句用于基于条件执行命令或代码块。它的基本语法结构如下:
if 条件; then# 如果条件为真时执行的代码
elif 另一个条件; then# 如果另一个条件为真时执行的代码
else# 如果所有条件都不成立时执行的代码
fi
一、if 语句中 &&、|| 和 ! 的使用方法
1、&& (逻辑与)
- && 用于连接两个命令,当左边的命令成功(即返回值为0)时,右边的命令才会执行。
# 语法结构:
if 条件一 && 条件二; thenecho "条件一和条件二都执行成功"
elseecho "条件一或条件二有失败"
fi
逻辑:
- 如果 条件一 成功(返回值为 0)且 条件二 也成功(返回值为 0),then 分支会执行。
- 如果 条件一 失败(返回非 0),或者 条件二 失败(返回非 0),else 分支会执行。
这个规则是基于“与”运算符:只有两个条件都成功,then 才会执行。
# 场景示例:检查一个文件是否存在且可执行
#!/bin/bashFILE="/home/user/file.sh"# [ ] 写法
if [ -e "$FILE" ] && [ -x "$FILE" ]; thenecho "[: 文件存在且可执行"
elseecho "[: 文件不存在或不可执行"
fi# [[ ]] 写法
if [[ -e "$FILE" && -x "$FILE" ]]; thenecho "[[: 文件存在且可执行"
elseecho "[[: 文件不存在或不可执行"
fi
2、|| (逻辑或)
- || 用于连接两个命令,当左边的命令失败(即返回值不为0)时,右边的命令才会执行
# 语法结构:
if 条件一 || 条件二; thenecho "条件一或条件二执行成功"
elseecho "条件一和条件二都执行失败"
fi
逻辑:
- 如果 条件一 成功(返回值为 0),then 分支会执行。
- 如果 条件一 失败(返回非 0),则会检查 条件二:
如果 条件二 成功(返回值为 0),then 分支也会执行。
如果 条件一 和 条件二 都失败(返回非 0),则会执行 else 分支。
这个规则是基于“或”运算符:只要有一个条件成功,then 就会执行。
# 场景示例:检查目录是否存在,如果不存在则创建
#!/bin/bashDIR="/home/user/mydir"if [[ -d "$DIR" ]] || mkdir "$DIR" > /dev/null 2>&1; thenecho "目录已存在或已成功创建"
elseecho "创建目录失败"
fi
3、! (逻辑非)
- ! 用于对一个条件进行取反。如果条件为真,! 会使其为假,反之亦然。
# 语法结构:
if ! 条件一; thenecho "条件一假,取反真"
elseecho "条件一真,取反假"
fi
# 示例
#!/bin/bashif [ ! -f "file.txt" ]; thenecho "文件不存在"
elseecho "文件存在"
fi
#!/bin/bash# ! 与 && 配合使用
if [ ! -f "file.txt" ] && echo "假如条件二成功"; thenecho "条件一(文件不存在,取反真)和条件二都执行成功"
elseecho "条件一(文件存在,取反假)或条件二有失败"
fi
二、检查文件和文件夹方法
1、判断文件是否存在 -f
#!/bin/bash# 获取当前脚本文件所在的目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)# 设置要检查的文件名
file="${SCRIPT_DIR}/example.txt"
echo ${file}# 判断文件是否存在
if [ -f "$file" ]; thenecho "$file 文件存在"
elseecho "$file 文件不存在"
fi
2、判断文件夹(目录)是否存在 -d
# 设置要检查的目录名
dir="/home/user/myfolder"# 判断目录是否存在
if [ -d "$dir" ]; thenecho "$dir 目录存在"
elseecho "$dir 目录不存在"
fi
其它参数 | 说明 |
---|---|
-e | 检查文件或目录是否存在(不管是文件还是目录) |
-r | 检查文件是否可读(非root权限下才能获取正确) |
-w | 检查文件是否可写(非root权限下才能获取正确) |
-x | 检查文件是否可执行(非root权限下才能获取正确) |
三、字符串比较、数值比较及算术比较
1.整数数值对比
数值比较参数 | 说明 |
---|---|
-lt | 表示 “less than”(小于) |
-eq | 表示 “equal to”(等于) |
-ne | 表示 “not equal to”(不等于) |
-gt | 表示 “greater than”(大于) |
-ge | 表示 “greater than or equal to”(大于或等于) |
-le | 表示 “less than or equal to”(小于或等于) |
示例
#!/bin/basha=2
b=2if [[ $a -eq $b ]]; thenecho "$a 等于 $b"
elseecho "$a 不等于 $b"
fi
2.字符串对比
字符串比较参数 | 说明 |
---|---|
== | 字符串相等 |
!= | 字符串不相等 |
示例
#!/bin/basha="abcdef"
b="abcde"# 比较字符串是否相等
if [[ $a == $b ]]; thenecho "字符串 '$a' 和 '$b' 相等"
elseecho "字符串 '$a' 和 '$b' 不相等"
fi# 比较字符串是否不相等
if [[ $a != $b ]]; thenecho "字符串 '$a' 和 '$b' 不相等"
elseecho "字符串 '$a' 和 '$b' 相等"
fi
3、算术比较
算术比较参数 | 说明 |
---|---|
< | 小于 |
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于或等于 |
<= | 小于或等于 |
#!/bin/bashnum1=5
num2=5if (( num1 == num2 )); thenecho "${num1} 和 ${num2} 相等"
elseecho "${num1} 和 ${num2} 不相等"
fia=10
b=1if (( (a + b) > 10 )); thenecho "a 和 b 的和大于 10"
fi
四、检查命令的退出状态
#!/bin/bash# 执行某个命令
ls /home > /dev/null 2>&1# 判断命令是否成功
if [ $? -eq 0 ] ; thenecho "命令执行成功"
elseecho "命令执行失败"
fi# $? 存储的是上一个命令的退出状态。
# 退出状态 0 通常表示命令成功执行,其他非零值表示命令执行失败。