命令行的魔法世界:Shell 编程基础全景指南
0. 序章:为什么学 Shell?
在 Linux 世界,Shell 是一位永不疲倦的魔法助手。
只要你会念咒(写命令/脚本),它就能帮你:
- 自动整理海量文件
- 定时备份数据库
- 在百台服务器间批量执行任务
- 一键部署项目环境
没有 Shell,你的效率可能像手动搅拌水泥;有了 Shell,你直接开上了自动搅拌机。
1. Shell 是什么?
从技术角度,Shell 是 命令解释器:
- 交互模式:你敲一条命令,它立即执行
- 脚本模式:你把命令写进文件,一次执行多个
常见 Shell:
- Bash(Bourne Again Shell,Linux 默认)
- Zsh(更炫的补全与主题)
- Fish(易用性好)
- POSIX sh(最兼容)
2. 你的第一行 Shell 咒语
echo "Hello World"
这是 Shell 世界的开门咒。
如果你写成脚本:
#!/bin/bash
echo "Hello World"
- 第一行
#!/bin/bash
是魔法书封面,告诉系统用哪个解释器执行 chmod +x hello.sh
给它魔力(执行权限)./hello.sh
释放魔法
3. 变量:魔法背包
变量是魔法师的随身背包,里面放着任务需要的各种信息。
name="Gandalf"
echo "Hello, $name"
规则:
- 赋值时等号左右不能有空格
$变量名
或${变量名}
引用- 变量作用域默认是全局,函数里需用
local
限定
4. 数据类型:一切皆字符串
Bash 没有强类型,所有数据都是字符串。
即使是数字运算,也得用 $((表达式))
:
a=5
b=3
sum=$((a+b))
echo $sum
5. 条件判断:魔法门的选择
if [ $age -ge 18 ]; then
echo "Adult"
else
echo "Child"
fi
-
[ 条件 ]
等价于test 条件
-
字符串比较:
=
相等!=
不等
-
数字比较:
-eq
等于-ne
不等-gt
大于-lt
小于-ge
大于等于-le
小于等于
-
文件测试:
-f file
文件存在且为普通文件-d dir
目录存在-e path
存在文件/目录-s file
文件存在且非空
6. 循环:魔法的时间轮回
for 循环:
for i in 1 2 3
do
echo "Casting spell $i"
done
while 循环:
count=1
while [ $count -le 3 ]
do
echo "Magic $count"
count=$((count+1))
done
7. 函数:封印咒语
greet() {
echo "Hello, $1"
}
greet "Frodo"
$1
第一个参数$#
参数数量$@
所有参数列表
8. 输入输出与管道:魔法的传送门
>
输出重定向到文件>>
追加输出<
从文件读取|
管道,把一个命令的输出交给另一个命令
例子:
cat file.txt | grep "keyword" > result.txt
9. 脚本调试:看透魔法轨迹
bash -x script.sh
打印每行执行过程- 在脚本开头加
set -x
开启调试,set +x
关闭
10. 让魔法更强的实用技巧
- 命令替换:
today=$(date +%Y-%m-%d)
echo "Today is $today"
- 批量处理:
for file in *.log; do rm "$file"; done
-
安全脚本习惯:
- 用
"$var"
包裹变量防止空格拆分 - 用
set -e
在出错时立即退出 - 用
set -u
禁止使用未定义变量
- 用
11. Shell 编程学习大纲
如果你想从小白到 Shell 高手,可以按这个路线走:
基础阶段
- 什么是 Shell / 常见 Shell 种类
- 运行命令 & 脚本文件
- 变量与字符串操作
- 基本算术与条件判断
- 循环(for / while / until)
进阶阶段
- 函数与参数处理
- 输入输出重定向
- 管道与过滤器(grep, awk, sed)
- 文件测试与目录操作
- 脚本调试与错误处理
高级阶段
- 数组与关联数组
- 正则表达式与文本处理
getopts
命令行参数解析- 子进程与后台任务
- 信号处理(trap)
实战阶段
- 日志分析脚本
- 自动化部署脚本
- 备份与恢复脚本
- 系统监控与报警脚本