文章目录
正文
1. Shell编程基础概念
1.1 Shell环境与解释器
# 查看系统可用Shell
cat /etc/shells
# 指定解释器(脚本首行)
#!/bin/bash # Bash解释器
#!/usr/bin/env bash # 环境变量定位
1.2 脚本执行方式
chmod +x script.sh # 添加执行权限
./script.sh # 直接执行
bash script.sh # 指定解释器执行
source script.sh # 当前Shell环境执行
2. 核心语法要素
2.1 变量操作
name="value" # 定义变量(无空格)
echo ${name} # 使用变量
readonly PI=3.14 # 只读变量
unset name # 删除变量
# 特殊变量
$0 脚本名称
$1-$9 位置参数
$# 参数个数
$*/$@ 所有参数
$? 上条命令返回值
2.2 字符串处理
str="Hello World"
echo ${#str} # 长度计算 → 11
echo ${str:0:5} # 子串截取 → Hello
echo ${str/World/Shell} # 替换操作 → Hello Shell
2.3 数值运算
# 整数运算(三种方式)
echo $((10 + 5)) # 算术扩展 → 15
echo $[20 / 4] # 方括号语法 → 5
let result=8*3 # let命令 → 24
# 浮点运算(需bc工具)
echo "scale=2; 10/3" | bc → 3.33
3. 流程控制结构
3.1 条件判断
3.1.1 if语句
if [[ -f "file.txt" ]]; then
echo "文件存在"
elif [[ -d "dir" ]]; then
echo "目录存在"
else
echo "路径无效"
fi
3.1.2 case语句
case $1 in
start)
echo "启动服务"
;;
stop|restart)
echo "操作: $1"
;;
*)
echo "无效指令"
;;
esac
3.2 循环结构
3.2.1 for循环
# 列表迭代
for i in {1..5}; do
echo "Count: $i"
done
# C风格语法
for ((i=0; i<3; i++)); do
echo "Index: $i"
done
3.2.2 while循环
count=3
while [[ $count -gt 0 ]]; do
echo "倒计时: $count"
((count--))
done
3.2.3 until循环
num=1
until [[ $num -gt 5 ]]; do
echo "数值: $num"
((num++))
done
4. 函数与模块化
4.1 函数定义
function calc_sum {
local a=$1 # 局部变量
local b=$2
echo $((a + b))
}
# 调用函数
result=$(calc_sum 15 25)
echo "结果: $result" # 输出 40
4.2 参数传递
#!/bin/bash
# 示例:script.sh arg1 arg2
echo "脚本名: $0"
echo "首个参数: ${1:-默认值}" # 参数缺省值
shift # 参数左移
echo "新首个参数: $1"
5. 高级处理技巧
5.1 正则表达式匹配
text="ID: 12345, Date: 2023-08-15"
if [[ $text =~ [0-9]{5} ]]; then
echo "找到ID: ${BASH_REMATCH[0]}" # 输出 12345
fi
5.2 信号处理
trap 'cleanup; exit 1' SIGINT SIGTERM
cleanup() {
echo "捕获中断信号,执行清理..."
rm -f tempfile.txt
}
6. 调试与优化
6.1 调试模式
#!/bin/bash -x # 启用跟踪调试
set -e # 错误自动退出
set -o pipefail # 管道错误捕获
6.2 性能分析
time ./script.sh # 统计执行时间
# 代码片段耗时检测
start=$(date +%s%N)
# 待测代码
duration=$((($(date +%s%N) - start)/1000000))
echo "耗时: ${duration}ms"
7. 实用代码示例库
7.1 文件批量处理
# 重命名所有.txt文件为.bak
for file in *.txt; do
mv "$file" "${file%.txt}.bak"
done
7.2 日志分析
# 统计访问日志TOP10 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n10
8. 常见问题解决方案
8.1 错误对照表
错误现象 | 解决方案 |
---|---|
命令未找到 | 检查PATH变量或使用绝对路径 |
权限拒绝 | chmod +x 或 sudo 执行 |
语法错误: unexpected token | 检查空格使用和符号转义 |
8.2 编码规范建议
- 使用双引号包裹变量
"$var"
- 避免使用全大写变量名(保留给系统变量)
- 使用
[[ ]]
代替[ ]
进行条件测试 - 复杂脚本添加注释头部(作者/功能/版本)
9. 学习路径推荐
- 掌握30个核心命令(grep/sed/awk等)
- 理解I/O重定向与管道机制
- 练习编写系统管理脚本
- 学习ShellCheck进行代码检查
- 研究开源项目中的Shell实践
结语
感谢您的阅读!期待您的一键三连!欢迎指正!