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