Shell脚本核心符号(Linux运维必备)

Shell符号是脚本的"键盘魔法",按功能分类梳理如下:

一、引号符号(字符转义/命令替换)

符号 语法示例 输出结果 核心作用
单引号 ' name='World'
echo 'Hello $name'
Hello $name 完全转义,所有特殊字符原样输出
双引号 " name='World'
echo "Hello $name"
Hello World 保留变量引用,转义大部分特殊字符
反引号 ` current_date=date<br>echo "当前时间: $current_date"` 当前时间: 2026-03-06 10:00:00 命令替换(推荐用 $() 替代)

🌟 最佳实践:优先用 $() 替代反引号,可读性更强且支持嵌套

二、变量符号(变量引用/运算)

1. 基础变量符号

符号 语法示例 说明
$ name="John"<br>echo $name 引用变量(基础用法)
${} name="web"<br>echo ${name}server 规范的变量引用,明确变量边界
$() `files=$(ls *.txt)
count=$(ls -1 *.txt
wc -l)`

2. 大括号 ${} 扩展用法

# 1. 数组操作
arr=(1 2 3)
echo ${arr[0]}    # 输出1(取第1个元素)
echo ${arr[@]}    # 输出1 2 3(所有元素)
echo ${#arr[@]}   # 输出3(数组长度)

# 2. 参数默认值/赋值
echo ${name:-"匿名用户"}  # name为空时显示默认值
echo ${count:=0}          # count为空时赋值为0并输出

# 3. 字符串截取
filepath="/path/to/file.txt"
echo ${filepath##*/}      # 输出file.txt(从左删除最长匹配)
echo ${filepath%.*}       # 输出/file.tar(从右删除最短匹配)

3. 算术运算符号

符号/命令 语法示例 输出结果 说明
$(( )) echo $((1+2))
echo $((10%3))
3
1
整数算术扩展(支持+、-、*、/、%)
expr result=$(expr 1 + 2) 3 老式算术命令(注意运算符前后空格)
let let "sum = 1 + 2" 3 直接执行算术赋值

三、重定向符号(输入输出控制)

符号 语法示例 核心作用
> echo "内容" > file.txt 标准输出覆盖写入文件
>> echo "新内容" >> file.txt 标准输出追加写入文件
< mysql -u root -p < backup.sql 从文件读取输入
2> command 2> error.log 错误输出覆盖写入文件
2>> command 2>> error.log 错误输出追加写入文件
&> command &> all.log 标准输出+错误输出合并覆盖
2>&1 command > output.log 2>&1 错误输出重定向到标准输出
<> exec 3<>file.txt
read -u 3 line
打开文件描述符,支持读写

💡 常用组合:command > /dev/null 2>&1(屏蔽所有输出)

四、管道与分隔符(命令执行控制)

符号 语法示例 核心作用
管道 ` ` `ps aux
命令分隔 ; cd /tmp; ls; pwd 依次执行多个命令(无论前序是否成功)
后台执行 & long_command &
nohup command &
命令后台运行,不阻塞终端
错误管道 ` &` `command

五、逻辑运算符(条件执行)

符号 语法示例 逻辑规则
逻辑与 && cd /tmp && ls 前命令执行成功(返回0),才执行后命令
逻辑或 ` `
逻辑非 ! ! command 反转命令的退出状态(成功变失败,失败变成功)

📌 示例:[ -f file.txt ] && echo "文件存在" || echo "文件不存在"

六、通配符(文件匹配)

符号 语法示例 匹配规则
* ls *.txt
rm /tmp/*
匹配任意长度的任意字符
? ls file?.txt 匹配单个任意字符
[] ls file[1-3].txt
ls file[abc].txt
匹配指定字符/字符范围
{} touch file{1..5}.txt
mkdir -p dir{a,b,c}
生成字符序列(扩展)

七、比较运算符(条件判断)

1. 字符串比较(用 [ ] 包裹)

运算符 语法示例 含义
= [ "$a" = "$b" ] 字符串相等
!= [ "$a" != "$b" ] 字符串不相等
-z [ -z "$a" ] 字符串为空
-n [ -n "$a" ] 字符串非空

2. 数值比较(用 [ ] 包裹)

运算符 语法示例 含义
-eq [ $a -eq $b ] 等于(equal)
-ne [ $a -ne $b ] 不等于(not equal)
-gt [ $a -gt $b ] 大于(greater than)
-lt [ $a -lt $b ] 小于(less than)
-ge [ $a -ge $b ] 大于等于(greater equal)
-le [ $a -le $b ] 小于等于(less equal)

3. 文件测试(用 [ ] 包裹)

运算符 语法示例 含义
-f [ -f file ] 文件存在且为普通文件
-d [ -d dir ] 目录存在
-r [ -r file ] 文件可读
-w [ -w file ] 文件可写
-x [ -x file ] 文件可执行
-s [ -s file ] 文件存在且不为空

八、特殊变量(脚本运行上下文)

变量 示例 含义
$? command; echo $? 上一个命令的退出状态(0=成功,非0=失败)
$$ echo "当前PID: $$" 当前脚本/进程的PID
$# echo "参数个数: $#" 脚本接收的参数总数
$* echo "$*" 所有参数作为单个字符串
$@ echo "$@" 所有参数作为独立字符串(推荐)
$0 echo "脚本名: $0" 当前脚本的名称
$1-$9 echo "第一个参数: $1" 脚本接收的第1~9个参数

九、模式匹配与注释符号

1. 模式匹配([[ ]] 中使用)

# 通配符匹配
if [[ $filename == *.txt ]]; then
    echo "文本文件"
fi

# 正则匹配
if [[ $email =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]]; then
    echo "有效邮箱"
fi

2. 注释符号

# 单行注释
echo "Hello"  # 行尾注释

# 多行注释(常用写法)
: << 'EOF'
这是多行注释
可以写任意内容
EOF

十、实战示例(符号组合运用)

示例1:文件备份脚本

#!/bin/bash
# 备份脚本(综合使用变量、重定向、条件判断)
backup_dir="/backup"
source_dir="/data"
date_str=$(date +%Y%m%d_%H%M%S)  # 命令替换

# 目录存在性判断
if [ -d "$source_dir" ]; then
    echo "开始备份: $source_dir"
    # 压缩备份,错误输出追加到日志
    tar -czf "$backup_dir/backup_$date_str.tar.gz" "$source_dir" 2>> backup.log
    
    # 判断备份是否成功
    if [ $? -eq 0 ]; then
        echo "备份成功: backup_$date_str.tar.gz"
    else
        echo "备份失败,请查看日志" >&2  # 错误输出到标准错误
    fi
else
    echo "源目录不存在" >&2
    exit 1
fi

示例2:系统监控脚本

#!/bin/bash
# 系统监控脚本(综合使用算术运算、循环、条件判断)
while true; do
    # CPU使用率(管道+变量提取)
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    
    # 内存使用率(浮点运算)
    mem_info=$(free | awk '/Mem/{printf "%.2f", $3/$2*100}')
    
    # 磁盘使用率
    disk_usage=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
    
    echo "CPU: ${cpu_usage}%, 内存: ${mem_info}%, 磁盘: ${disk_usage}%"
    
    # CPU告警(浮点比较)
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        echo "CPU使用率过高: ${cpu_usage}%" | mail -s "告警" admin@example.com
    fi
    
    sleep 60  # 休眠60秒
done

学习建议(循序渐进)

  1. 优先掌握核心符号$">>>|&&||(日常80%场景够用);
  2. 实践验证:每个符号亲自写小脚本测试,比如 echo "test" > file.txt 查看文件内容;
  3. 组合运用:比如 ps aux | grep nginx | grep -v grep(过滤nginx进程,排除自身);
  4. 查阅手册:通过 man bash 查看符号的官方说明,了解边界场景。

总结

  1. Shell符号按功能可分为引号/变量/重定向/逻辑/通配符五大类,核心是控制"输入输出/变量引用/条件执行";
  2. 符号的优先级和上下文(如 {} 在变量和通配符中含义不同)需重点注意;
  3. 实战是掌握关键,通过备份、监控等脚本组合使用符号,能快速提升熟练度。