悠悠楠杉
学习笔记0402----shell基础知识,shell基础教程
一、为什么Shell脚本依然不可替代?
在图形界面大行其道的今天,很多初学者会疑惑:为什么我们还要学习黑漆漆的命令行?事实上,Shell脚本作为Linux系统的"粘合剂",在服务器运维、批量处理、自动化部署等领域仍是无可替代的工具。上周我帮同事处理一个需求——需要统计500个日志文件中特定错误出现的次数,用Shell脚本三行代码就解决了问题,而图形界面操作可能需要重复劳动数小时。
二、Shell环境深度解析
2.1 主流Shell类型对比
- Bash(Bourne-Again Shell):Linux默认shell,兼容性强
- Zsh:支持智能补全,适合交互使用
- Dash:轻量级,常用于系统启动脚本
bash
查看当前使用的shell
echo $SHELL
查看系统可用shell
cat /etc/shells
2.2 环境变量那些事儿
环境变量就像脚本世界的全局公告板,理解它们对脚本调试至关重要。有一次我写的脚本在同事机器上总是报错,最后发现是$PATH变量配置不同导致的。常用变量包括:
- $HOME
用户家目录
- $PATH
命令搜索路径
- $PS1
命令行提示符格式
三、脚本编写实战技巧
3.1 第一个专业级脚本
避免新手常犯的"裸奔脚本"错误,规范的脚本应该包含:
bash
!/bin/bash
作者:你的名字
功能:日志文件分析
版本:1.0
set -euo pipefail # 开启严格模式
LOGDIR="/var/log/myapp" ERRORPATTERN="Connection timeout"
main() {
local count=0
for logfile in "${LOGDIR}"/*.log; do
count=$((count + $(grep -c "${ERRORPATTERN}" "${logfile}")))
done
echo "Total errors found: ${count}"
}
main "$@"
3.2 流程控制进阶
- 条件判断的隐藏陷阱:bash
字符串比较要用双中括号
if [[ "${name}" == "root" ]]; then
echo "Administrator mode"
elif (( UID == 0 )); then # 数值比较用双括号
echo "Also superuser"
fi
- 循环处理的高效写法:bash
处理带空格的文件名
find . -name "*.txt" -print0 | while IFS= read -r -d '' file; do
wc -l "${file}"
done
四、调试的艺术
4.1 常见调试手段
set -x
开启执行追踪trap 'echo Error at $LINENO' ERR
错误捕获- 使用shellcheck静态检查工具
4.2 我踩过的坑
- 变量未引用的灾难:bash
错误示范
rm -rf $tempdir/ # 如果tempdir为空,会变成 rm -rf /
正确写法
rm -rf "${temp_dir}/"
- 管道命令的返回值:bash
获取管道中最后一个命令的返回值
set -o pipefail
grep "error" logfile | wc -l
五、生产力提升秘诀
5.1 常用代码片段
快速备份:
bash backup() { local file="$1" cp -v "${file}" "${file}.bak.$(date +%Y%m%d%H%M)" }
批量重命名:bash
将所有.jpg改为.png
for img in *.jpg; do
mv -- "$img" "${img%.jpg}.png"
done
5.2 与其它工具配合
结合awk处理列数据:
bash df -h | awk '$5 > "90%" {print $6 " is almost full: " $5}'
调用Python增强功能:bash
计算MD5校验
get_md5() {
python3 -c "import hashlib; print(hashlib.md5(open('$1','rb').read()).hexdigest())"
}
六、学习路线建议
- 先掌握20个核心命令(grep/sed/awk/find等)
- 理解I/O重定向和管道
- 学习正则表达式基础
- 练习编写模块化脚本
- 研究知名开源项目的启动脚本
推荐书籍:《Linux命令行与shell脚本编程大全》第三版,这本书的实战案例尤其值得借鉴。记住,Shell脚本不是越复杂越好,能够解决问题的就是好脚本。上周我用一个简单的while read循环替代了同事写的30行Python脚本,这就是Shell的魅力所在。
后记:每次看到自己写的脚本在服务器上稳定运行,那种"四两拨千斤"的成就感总是令人愉悦。Shell就像一把瑞士军刀,看起来简单,但在高手手中能解决各种意想不到的问题。你现在遇到的90%的日常操作,可能都可以用Shell脚本来优化,关键在于开始动手实践。