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
学习建议(循序渐进)
- 优先掌握核心符号:
$、"、>、>>、|、&&、||(日常80%场景够用);
- 实践验证:每个符号亲自写小脚本测试,比如
echo "test" > file.txt 查看文件内容;
- 组合运用:比如
ps aux | grep nginx | grep -v grep(过滤nginx进程,排除自身);
- 查阅手册:通过
man bash 查看符号的官方说明,了解边界场景。
总结
- Shell符号按功能可分为引号/变量/重定向/逻辑/通配符五大类,核心是控制"输入输出/变量引用/条件执行";
- 符号的优先级和上下文(如
{} 在变量和通配符中含义不同)需重点注意;
- 实战是掌握关键,通过备份、监控等脚本组合使用符号,能快速提升熟练度。