Shell基础与变量
Shell基础与变量
1. Shell脚本基础
什么是Shell脚本?
- 自动化运维工具
- 批处理任务
- 系统管理
第一个Shell脚本
#!/bin/bash echo "Hello, World!"
chmod +x script.sh
赋予执行权限./script.sh
运行脚本
2. 特殊变量
变量 | 含义 | 示例 |
---|---|---|
$? |
上一条命令的退出状态 | echo $? |
$$ |
当前Shell的PID | echo $$ |
$0 |
脚本名称 | echo $0 |
$1, $2, ... |
脚本参数 | echo $1 |
${10} |
第10个参数(避免$10 解析错误) |
echo ${10} |
$# |
参数个数 | echo $# |
$@ |
所有参数(每个参数独立) | for arg in "$@" |
$* |
所有参数(合并成一个字符串) | echo "$*" |
示例:打印所有参数
#!/bin/bash
echo "脚本名: $0"
echo "参数个数: $#"
echo "所有参数: $@"
echo "第一个参数: $1"
echo "第二个参数: $2"
3. 变量定义与使用
- 变量定义
name="Alice" age=25
- 变量引用
echo $name echo ${name} # 推荐使用${}避免歧义
- 只读变量
readonly PI=3.1415
- 删除变量
unset name
4. 字符串操作
str="Hello World"
echo ${#str} # 字符串长度
echo ${str:0:5} # 截取子串
echo ${str/World/Linux} # 替换
5. 数组
arr=("apple" "banana" "cherry")
echo ${arr[1]} # 访问元素
echo ${arr[@]} # 所有元素
echo ${#arr[@]} # 数组长度
下午:条件判断与循环
1. 条件判断(if)
基本语法
if [ condition ]; then
commands
elif [ condition ]; then
commands
else
commands
fi
常用判断条件
| 条件 | 含义 |
|——|——|
| -f file
| 文件是否存在 |
| -d dir
| 目录是否存在 |
| -z str
| 字符串是否为空 |
| -n str
| 字符串是否非空 |
| a -eq b
| 数值相等 |
| a -ne b
| 数值不等 |
| a -gt b
| a > b |
| a -lt b
| a < b |
示例:检查文件是否存在
if [ -f "/etc/passwd" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
2. 循环(for/while)
for循环
for i in {1..5}; do
echo "Number: $i"
done
while循环
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
((count++))
done
示例:遍历目录下的文件
for file in /var/log/*; do
echo "Found file: $file"
done
3. case语句
case $1 in
"start")
echo "Starting service..."
;;
"stop")
echo "Stopping service..."
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
实战案例与运维脚本
实战案例
1. 求水仙花数
#!/bin/bash
for num in {100..999}; do
a=$((num / 100))
b=$((num % 100 / 10))
c=$((num % 10))
if [ $((a*a*a + b*b*b + c*c*c)) -eq $num ]; then
echo "水仙花数: $num"
fi
done
2. 查找包含特定文字的文件
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 <directory> <text>"
exit 1
fi
dir=$1
text=$2
if [ ! -d "$dir" ]; then
echo "目录不存在: $dir"
exit 1
fi
grep -rl "$text" "$dir"
3. 批量重命名文件
#!/bin/bash
count=1
for file in *.txt; do
mv "$file" "document_$count.txt"
((count++))
done
运维脚本实战
1. 监控CPU使用率
#!/bin/bash
threshold=80
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d. -f1)
if [ $cpu_usage -gt $threshold ]; then
echo "CPU使用率过高: $cpu_usage%"
# 发送警报邮件
echo "CPU警报" | mail -s "CPU使用率 $cpu_usage%" admin@example.com
fi
2. 自动备份MySQL数据库
#!/bin/bash
DB_USER="root"
DB_PASS="password"
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d)
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
fi
mysqldump -u$DB_USER -p$DB_PASS --all-databases > "$BACKUP_DIR/db_backup_$DATE.sql"
gzip "$BACKUP_DIR/db_backup_$DATE.sql"
3. 检查磁盘空间
#!/bin/bash
threshold=90
df -h | awk 'NR>1 {print $5, $6}' | while read usage mount; do
usage=${usage%\%}
if [ $usage -gt $threshold ]; then
echo "磁盘空间不足: $mount ($usage%)"
fi
done
4. 批量创建用户
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <user_list_file>"
exit 1
fi
while read username; do
if id "$username" &>/dev/null; then
echo "用户已存在: $username"
else
useradd "$username"
echo "用户创建成功: $username"
fi
done < "$1"
作业:
- 写一个脚本,统计指定目录下每种文件扩展名的数量
- 写一个脚本,检查系统中所有运行中的服务并列出监听端口
- 写一个脚本,自动清理
/tmp
下超过7天的文件
作者:admin 创建时间:2025-05-29 09:34
最后编辑:admin 更新时间:2025-05-29 13:26
最后编辑:admin 更新时间:2025-05-29 13:26