Shell 脚本核心语法精要
变量操作
赋值时等号两侧严禁空格,取值时通过 $ 前缀或花括号包裹变量名:
count=5
msg='hello world'
echo $count $msg
echo ${count} ${msg}条件分支
基础结构如下,then 可与 if 同行但需分号分隔:
if 测试条件; then
执行语句
elif 其他条件; then
备选语句
else
默认语句
fi测试条件的三种形式
- 直接执行命令(返回码 0 为真)
test命令[ ]或[[ ]]([实为内置命令,两端须留空格)
普通命令示例:
if ls | grep -q hello; then
echo "找到匹配文件"
else
echo "未找到"
fi文件检测
| 选项 | 含义 |
|---|---|
-e | 文件存在 |
-f | 普通文件 |
-d | 目录 |
-r | 可读 |
-w | 可写 |
-x | 可执行 |
if [ -f "/etc/hosts" ]; then
echo "配置文件已存在"
fi字符串比较
if [ "$str1" = "$str2" ]; then
echo "两字符串相同"
fi
# 判空
[ -z "$empty_str" ] # 长度为真
[ -n "$non_empty" ] # 长度非真
# 大小比较(单方括号需转义)
[ "$a" \> "$b" ]
[[ "$a" > "$b" ]]数值比较
| 运算符 | 含义 |
|---|---|
-eq | 等于 |
-ne | 不等于 |
-lt | 小于 |
-le | 小于等于 |
-gt | 大于 |
-ge | 大于等于 |
num_a=42
num_b=7
if [ $num_a -gt $num_b ]; then
echo "前者更大"
fi
# 双圆括号支持类 C 语法
if (( num_a ** 2 > 1000 )); then
echo "平方超过千"
fi组合条件
# 与
[ -f "$file" -a -r "$file" ]
# 或
[ -z "$var" -o "$var" = "none" ]
# 非
[ ! -d "$path" ]正则匹配
=~ 仅在 [[ ]] 中生效,左侧为待匹配字符串,右侧为模式:
tasks="MRPC RTE STSB CoLA"
if [[ "$tasks" =~ RTE ]]; then
echo "包含 RTE 任务"
fi数组使用
定义与索引访问:
tasks=(MRPC RTE STSB CoLA)
# 修改元素
tasks[1]=SST
# 读取元素
second=${tasks[1]}
# 展开全部元素
echo ${tasks[@]}
echo ${tasks[*]}调试选项
| 命令 | 作用 |
|---|---|
set -e | 遇错即停 |
set -u | 未定义变量报错 |
set -o pipefail | 管道错误传递 |
set -x | 打印执行轨迹 |
set +x | 关闭轨迹打印 |
推荐脚本头部配置:
set -euo pipefail算术运算
# let 命令
let result=10*3+5
# 双圆括号
result=$((10 * 3 + 5))
# 变量参与运算
base=7
total=$((base * 6 + 3))引号特殊处理
单引号内无法直接转义单引号本身,需借助 $'' 语法:
# 错误
echo 'it\'s'
# 可行但繁琐
echo $'it\'s'
# 推荐:双引号包裹
echo "it's"