Shell脚本中的运算符与流程控制结构详解
算术运算实现方式
在Shell脚本中,执行数学计算有多种语法形式。推荐使用双括号或反引号结合expr命令进行表达式求值。
# 方法一:使用 $((...))
result1=$(( (5 + 3) * 2 ))
# 方法二:使用 [...]
result2=$[ (5 + 3) * 2 ]
# 方法三:使用 expr 命令(注意空格和转义)
temp=$(expr 5 + 3)
result3=$(expr $temp \* 2)
使用expr时需特别注意:操作符两侧必须有空格,乘法符号*需要反斜杠转义以避免被解释为通配符。
循环结构:for语句
Shell支持两种for循环写法:列表遍历和C风格计数器循环。
# 遍历参数列表
for item in "$@"
do
echo "参数: $item"
done
# C风格循环,累加1到n
sum=0
for (( counter=1; counter<=$1; counter++ ))
do
sum=$((sum + counter))
done
echo "总和: $sum"
其中$*将所有参数视为单个字符串,而$@则逐个处理每个参数,通常更推荐使用"$@"。
条件测试表达式
Shell使用方括号[ ]包裹条件判断,内部需保留空格。支持字符串、数值、文件状态等比较。
# 字符串相等性判断
if [ "hello" = "hello" ]; then
echo "字符串匹配"
fi
# 数值比较
if [ 88 -gt 60 ]; then
echo "成绩及格"
fi
# 文件存在性和类型检查
if [ -e /etc/passwd ]; then
echo "文件存在"
fi
if [ -d /tmp ]; then
echo "这是一个目录"
fi
if [ -r ~/.bashrc ]; then
echo "具有读权限"
fi
常见数值比较操作符包括:-eq(等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)。
分支控制:if语句
if结构用于根据条件执行不同代码块,支持单分支和多分支逻辑。
#!/bin/bash
score=$1
if [ $score -ge 85 ]; then
echo "优秀"
elif [ $score -ge 75 ]; then
echo "良好"
elif [ $score -ge 60 ]; then
echo "及格"
else
echo "不及格"
fi
确保[与条件之间有空格,否则会导致语法错误。
条件循环:while语句
while循环在条件为真时重复执行代码块,适用于不确定迭代次数的场景。
#!/bin/bash
# 计算从1累加到输入值n的总和
total=0
index=1
n=$1
while [ $index -le $n ]
do
total=$((total + index))
index=$((index + 1))
done
echo "1到$n的累加结果是: $total"
多路分支选择:case语句
当需要对变量的不同取值执行对应操作时,case语句比多个if更清晰高效。
#!/bin/bash
day=$1
case $day in
"1")
echo "星期一"
;;
"2")
echo "星期二"
;;
"3")
echo "星期三"
;;
*)
echo "其他日期"
;;
esac
星号*作为默认匹配项,捕获所有未明确列出的情况。每个分支以;;结束。
用户输入处理:read命令
read用于从标准输入读取数据并赋值给变量,可配合选项提升交互体验。
# 提示用户输入并等待
read -p "请输入用户名: " username
echo "你好, $username!"
# 设置超时限制(10秒内无输入则跳过)
if read -t 10 -p "请在10秒内输入验证码: " code; then
echo "收到验证码: $code"
else
echo "输入超时"
fi
常用选项:
-p "提示信息":自定义输入提示-t 秒数:设定等待超时时间