一、Shell基础入门
1.1 Shell简介与分类
Shell是用户与Linux内核交互的桥梁,负责解析用户命令并传递给内核执行。主要分为两类:
- 图形界面Shell(GUI Shell):如KDE、Gnome,提供可视化操作界面。
- 命令行界面Shell(CLI Shell):主流实现为Bash,通过命令行输入指令,是Linux默认Shell。
1.2 第一个Shell脚本编写与执行
bash
#!/bin/bash # 指定解释器
echo "Hello World!" # 输出语句
执行方式:
- 直接调用解释器 :
bash test.sh
- 赋予执行权限 :
chmod +x test.sh && ./test.sh
- 当前Shell执行 :
source test.sh
或. test.sh
1.3 变量系统
- 系统变量 :通过
env
或set
查看,如$HOME
(用户家目录)、$PATH
(可执行路径)。 - 普通变量 :
VAR=value
,引用需加$
,如echo $VAR
。 - 位置变量 :
$1-$n
表示脚本参数,第10个参数需用${10}
。 - 特殊变量 :
$0
(脚本名)、$?
(上一命令退出状态)、$$
(当前进程PID)。
二、Shell核心语法与操作
2.1 字符串处理
-
长度获取 :
${#VAR}
,如echo ${#"hello"}
输出5。 -
切片操作 :
${VAR:offset:length}
,如${"hello":1:3}
输出"ell"。 -
替换与截取 :
bashVAR="hello world" echo ${VAR/world/WORLD} # 替换第一个匹配:hello WORLD echo ${VAR#*o} # 截取首个o后的内容:llo world
2.2 表达式与运算符
- 条件表达式 :使用
[ ]
或[[ ]]
,如[ $a -eq $b ]
。 - 整数比较 :
-eq
(等于)、-gt
(大于)、-lt
(小于)。 - 文件测试 :
-e
(存在)、-f
(文件)、-d
(目录),如[ -f /etc/passwd ]
。
2.3 流程控制
-
if语句 :
bashif [ $num -gt 10 ]; then echo "大于10" else echo "小于等于10" fi
-
循环结构 :
bash# for循环 for i in {1..5}; do echo $i; done # while循环 i=1; while [ $i -le 5 ]; do echo $i; let i++; done
-
分支结构 :
bashcase $var in "a") echo "匹配a" ;; "b") echo "匹配b" ;; *) echo "默认" ;; esac
三、文本处理与正则表达式
3.1 文本处理三剑客
-
grep :过滤匹配行,支持正则,如
grep "error" log.txt
。 -
sed :流编辑器,用于替换、删除等操作:
bashsed 's/old/new/g' file.txt # 全局替换old为new
-
awk :格式化处理文本,支持字段操作:
bashawk -F: '{print $1}' /etc/passwd # 按:分割,打印第一字段
3.2 正则表达式
-
基础符号 :
.
:匹配任意字符(除换行)。^
:行首匹配,$
:行尾匹配。*
:匹配前一个字符0次或多次,+
:1次或多次。
-
扩展应用 :
bashecho "abc123" | grep -E "[a-z]+[0-9]+" # 匹配字母后跟数字
四、实战案例:自动化运维脚本
4.1 批量创建用户
bash
#!/bin/bash
USER_FILE=users.txt
[ -f $USER_FILE ] && mv $USER_FILE ${USER_FILE}.$(date +%F)
touch $USER_FILE
for i in {1..10}; do
username=user$i
password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)
useradd $username && echo "$password" | passwd --stdin $username
echo "用户:$username,密码:$password" >> $USER_FILE
done
4.2 监控主机存活状态
bash
#!/bin/bash
IP_LIST="192.168.1.1 192.168.1.2"
for ip in $IP_LIST; do
ping -c 1 $ip &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip 存活"
else
echo "$ip 不可达" | mail -s "主机监控" [email protected]
fi
done
4.3 网站可用性检测
bash
#!/bin/bash
URL="https://www.baidu.com"
status_code=$(curl -s -o /dev/null -w "%{http_code}" $URL)
if [ $status_code -ne 200 ]; then
echo "网站状态异常:$status_code" | mail -s "网站监控" [email protected]
fi
五、高级技巧与工具
5.1 信号处理与后台运行
- kill命令 :发送信号终止进程,如
kill -9 $PID
强制终止。 - nohup :后台运行脚本,如
nohup ./script.sh &> log.txt &
。
5.2 网络与文件传输
- scp :安全复制文件,
scp /local/file user@remote:/path
。 - rsync :高效同步文件,
rsync -avz /src/ user@remote:/dst/ --delete
。
5.3 交互式脚本(Expect)
bash
#!/usr/bin/expect
spawn ssh user@remote
expect "password:"
send "your_password\r"
expect "$ "
send "ls -l\r"
expect "$ "
send "exit\r"
expect eof
六、最佳实践与调试
6.1 脚本优化建议
- 注释规范 :关键步骤添加注释,如
# 检查文件是否存在
。 - 错误处理 :使用
set -e
确保脚本遇错终止,set -x
打印执行过程。 - 参数校验 :使用
getopts
解析参数,如./script.sh -f file.txt -n 10
。
6.2 调试工具
- echo调试 :输出变量值,如
echo "当前路径:$PATH"
。 - shell选项 :
bash -x script.sh
跟踪执行步骤,bash -n script.sh
检查语法。
总结
Shell脚本是Linux运维的核心技能,通过掌握基础语法、文本处理工具及实战案例,可大幅提升自动化运维效率。建议从简单脚本开始,逐步挑战复杂场景,结合实际需求不断优化脚本逻辑,最终实现高效的系统管理与故障处理。