前言
在 shell 编程中,[]
通常用于条件测试。
条件中的参数
字符串比较:
=
: 字符串相等。!=
: 字符串不相等。
if [ "$string1" = "$string2" ]; thenecho "字符串相等"
fi
文件测试:
-e
: 文件或目录是否存在。-f
: 是否为普通文件。-d
: 是否为目录。-s
: 文件是否非空。
if [ -e "/path/to/file" ]; thenecho "文件存在"
fi
数字比较:
-eq
: 等于。-ne
: 不等于。-lt
: 小于。-le
: 小于等于。-gt
: 大于。-ge
: 大于等于。
if [ "$num1" -eq "$num2" ]; thenecho "数字相等"
fi
文件权限:
-r
: 是否可读。-w
: 是否可写。-x
: 是否可执行。
if [ -r "/path/to/file" ]; thenecho "文件可读"
fi
实例
检查文件是否存在
if [ -e "/path/to/file" ]; thenecho "文件存在"
elseecho "文件不存在"
fi
比较数字大小
num1=5
num2=10if [ $num1 -lt $num2 ]; thenecho $num1 小于 $num2
elseecho $num1 不小于 $num2
fi
字符串比较
string1="hello"
string2="world"if [ "$string1" = "$string2" ]; thenecho "字符串相等"
elseecho "字符串不相等"
fi
检查目录是否为空
if [ -z "$(ls -A /path/to/directory)" ]; thenecho "目录为空"
elseecho "目录不为空"
fi
逻辑运算
condition1=true
condition2=falseif [ "$condition1" = true -a "$condition2" = false ]; thenecho "满足逻辑与条件"
elseecho "不满足逻辑与条件"
fi
使用逻辑非判断文件是否不可写
if [ ! -w "/path/to/file" ]; thenecho "文件不可写"
elseecho "文件可写"
fi
比较字符串长度
str="abc"if [ ${#str} -gt 2 ]; thenecho "字符串长度大于2"
elseecho "字符串长度不大于2"
fi
使用逻辑或检查多个条件
age=25if [ "$age" -lt 18 -o "$age" -gt 65 ]; thenecho "年龄不在工作范围内"
elseecho "年龄在工作范围内"
fi
检查是否为目录
dir="/path/to/directory"if [ -d "$dir" ]; thenecho "是一个目录"
elseecho "不是一个目录"
fi
检查用户是否具有特定权限
if [ -w "/path/to/file" -a -r "/path/to/file" ]; thenecho "用户具有读写权限"
elseecho "用户缺少读写权限"
fi
使用正则表达式匹配
email="user@example.com"if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; thenecho "有效的电子邮件地址"
elseecho "无效的电子邮件地址"
fi
检查命令是否执行成功
if [ $? -eq 0 ]; thenecho "上一个命令成功执行"
elseecho "上一个命令执行失败"
fi
检查变量是否被定义
if [ -z "$my_variable" ]; thenecho "变量未定义"
elseecho "变量已定义"
fi
使用通配符进行字符串匹配
filename="document.txt"if [ "$filename" = *.txt ]; thenecho "文件名以 .txt 结尾"
elseecho "文件名不以 .txt 结尾"
fi
检查用户是否为超级用户
if [ $(id -u) -eq 0 ]; thenecho "当前用户是超级用户 (root)"
elseecho "当前用户不是超级用户"
fi
检查数组是否为空
my_array=("item1" "item2")if [ ${#my_array[@]} -eq 0 ]; thenecho "数组为空"
elseecho "数组不为空"
fi
使用 case
语句进行多条件判断
fruit="apple"case $fruit in"apple")echo "这是一个苹果";;"banana")echo "这是一个香蕉";;*)echo "未知水果";;
esac
循环遍历目录中的文件并执行操作
directory="/path/to/files"for file in "$directory"/*; doif [ -f "$file" ]; thenecho "处理文件: $file"# 在这里添加你的操作fi
done
根据用户输入执行不同的操作
echo "请选择操作: 1) 备份 2) 恢复 3) 退出"
read choicecase $choice in1)echo "执行备份操作"# 在这里添加备份操作的代码;;2)echo "执行恢复操作"# 在这里添加恢复操作的代码;;3)echo "退出";;*)echo "无效的选择";;
esac
检查多个文件的权限并生成报告
files=( "/path/to/file1" "/path/to/file2" "/path/to/file3" )for file in "${files[@]}"; doif [ -e "$file" ]; thenecho "文件: $file"if [ -r "$file" ]; thenecho "可读"fiif [ -w "$file" ]; thenecho "可写"fiif [ -x "$file" ]; thenecho "可执行"fiecho "---"elseecho "文件不存在: $file"fi
done
循环等待用户输入直到有效输入为止
valid_input=falsewhile [ "$valid_input" = false ]; doread -p "请输入一个有效的数字: " numberif [[ "$number" =~ ^[0-9]+$ ]]; thenecho "有效的输入: $number"valid_input=trueelseecho "无效的输入,请输入一个数字。"fi
done