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