Shell是用户与操作系统内核之间的命令解释器,它接收用户输入的命令并转换为系统调用,是Unix/Linux系统的核心交互界面
。Shell脚本(Shell Script)则是将一系列Shell命令组织成文本文件,通过解释器批量执行的自动化工具,广泛应用于系统管理、日志分析和软件部署等领域。
主流Shell类型:
Shell脚本的核心价值在于:
我们可以直接vim一个,sh后缀的一个文件,然后在里面写东西就好了
vim test.sh #这样就创建了一个shell文件
每个Shell脚本应以shebang声明开头,指定解释器路径:
#!/bin/bash
# 或者更灵活的写法:
#!/usr/bin/env bash
脚本执行方法:
chmod +x script.sh
./script.sh
bash script.sh
source script.sh
注意:执行权限问题常导致新手困惑,推荐新手先用
bash script.sh
方式执行
变量定义规则:
name="John" # 字符串变量
count=10 # 数值变量
files=$(ls) # 命令执行结果赋值
readonly PI=3.14 # 只读变量
变量引用方式:
echo $name # 基本引用
echo ${name} # 推荐写法,明确边界[2](@ref)
echo "${name}" # 保留空格和特殊字符
特殊变量:
$0
脚本名称$1-$9
位置参数$#
参数个数$@
所有参数$?
上条命令退出状态$$
当前进程PID用户输入:
read -p "请输入用户名: " username # -p显示提示
read -s -p "密码: " password # -s隐藏输入
输出控制:
echo "Hello $name" # 基本输出
echo -e "Line1\nLine2" # -e解析转义符
printf "%-10s %5d\n" $name $age # 格式化输出[4](@ref)
彩色输出(增强可读性):
echo -e "\033[31;40m红色文字\033[0m" # 31前景色,40背景色
if-then-else结构:
if [ $age -ge 18 ]; then
echo "成年人"
elif [ $age -gt 12 ]; then
echo "青少年"
else
echo "儿童"
fi
常用测试运算符:
case多分支结构:
case "$OS" in
"Linux")
echo "使用yum或apt"
;;
"Darwin")
echo "使用brew"
;;
*)
echo "未知系统"
;;
esac
for循环:
# 数值范围
for i in {1..5}; do
echo $i
done
# C语言风格
for ((i=0; i<10; i++)); do
echo $i
done
# 文件处理
for file in *.log; do
echo "处理: $file"
done
while/until循环:
# while满足条件执行
count=1
while [ $count -le 5 ]; do
echo $count
count=$((count + 1))
done
# until不满足条件执行
until [ $count -gt 10 ]; do
echo $count
count=$((count + 1))
done
# 读取文件行
while read line; do
echo "行内容: $line"
done < file.txt
基本函数:
greet() {
echo "Hello, $1!"
}
greet "Alice" # 输出: Hello, Alice!
带返回值函数:
add() {
return $(($1 + $2))
}
add 3 5
echo "结果: $?" # $?获取返回值
函数参数处理:
$1-$9
获取位置参数$#
参数个数$@
所有参数Shell支持多种数值计算方式:
方式 | 示例 | 特点 | 适用场景 |
---|---|---|---|
$(( )) |
echo $((a + b)) |
整数运算,无需转义 | 常规算术运算 |
let |
let "result=a*b" |
直接修改变量 | 复合运算 |
expr |
expr $a \* $b |
兼容性好,需转义符号 | 老旧系统 |
bc |
`echo "scale=2;3/7" | bc` | 支持浮点运算 |
实际应用:
# 整数运算
sum=$((3 + 5))
# 浮点运算
area=$(echo "scale=2;3.14 * 5^2" | bc)
# 自增操作
((count++))
#!/bin/bash
# 自动备份网站目录并清理旧备份[2](@ref)
BACKUP_DIR="/data/backup"
[ ! -d "$BACKUP_DIR" ] && mkdir -p "$BACKUP_DIR"
# 压缩备份
tar -czf "${BACKUP_DIR}/web_$(date +%Y%m%d).tar.gz" /var/www/html
# 删除7天前的备份
find "$BACKUP_DIR" -name "web_*.tar.gz" -mtime +7 -exec rm {} \;
echo "备份完成于: $(date +%F\ %T)"
#!/bin/bash
# 检查Nginx服务状态[7](@ref)
check_service() {
if systemctl is-active "$1" >/dev/null; then
echo "$1 服务运行正常"
return 0
else
echo "$1 服务未运行!"
return 1
fi
}
check_service nginx
check_service mysql
# 添加定时任务(crontab -e)
# 0 * * * * /path/to/script.sh
#!/bin/bash
# 交互式用户管理界面[3,6](@ref)
show_menu() {
echo "1. 添加用户"
echo "2. 删除用户"
echo "3. 列出用户"
echo "4. 退出"
}
while true; do
show_menu
read -p "请选择操作: " choice
case $choice in
1)
read -p "输入用户名: " username
useradd "$username" && echo "用户添加成功"
;;
2)
read -p "输入要删除的用户名: " username
userdel "$username" && echo "用户删除成功"
;;
3)
cut -d: -f1 /etc/passwd | sort
;;
4)
echo "再见!"
exit 0
;;
*)
echo "无效选择!"
;;
esac
done
bash -n script.sh
bash -v script.sh
bash -x script.sh
bash -xvn script.sh
代码规范:
错误处理:
# 检查命令是否成功执行
if ! mkdir "/data"; then
echo "创建目录失败!" >&2
exit 1
fi
性能优化:
安全性:
Shell脚本作为Linux系统管理的利器,掌握其核心语法和设计思想能极大提升运维效率。本文从基础语法到实战应用,系统介绍了Shell编程的完整知识体系。建议读者从简单脚本入手,逐步尝试实现自动化任务,最终达到精通水平。
延伸学习方向:
记住:最好的学习方式就是实践,尝试将日常重复工作脚本化,你会迅速成长为Shell编程高手!