编程语言分类与 Shell 脚本编写执行方式全解析
从计算机语言发展脉络到 Shell 实战技巧
1. 编程语言分类:从宏观视角看语言家族
编程语言的分类方法有很多,这里我从执行方式、抽象层次和用途领域三个维度来分析。
1.1 按执行方式分类
-
编译型语言
- 代表:C、C++、Go、Rust
- 特点:代码需经过编译器一次性翻译成机器码,执行效率高,部署前需编译。
- 优势:运行速度快、内存占用低
- 劣势:开发周期稍长,调试需要重新编译
-
解释型语言
- 代表:Python、JavaScript、PHP、Shell
- 特点:逐行解释执行,不需要单独编译步骤,运行灵活
- 优势:开发快、跨平台性好
- 劣势:运行速度相对慢
-
混合型语言(编译+解释)
- 代表:Java、C#、Kotlin
- 特点:先编译成中间字节码(bytecode),再由虚拟机(JVM、.NET CLR)解释/即时编译(JIT)执行
- 优势:兼顾跨平台与性能
- 劣势:虚拟机启动和内存开销较大
1.2 按抽象层次分类
- 低级语言:直接面向硬件(机器语言、汇编语言)
- 高级语言:面向人类逻辑(Python、Java、C)
- 领域专用语言(DSL):特定领域使用(SQL、HTML、正则表达式)
1.3 按用途领域分类
- 系统编程语言:C、Rust(写内核、驱动、操作系统)
- 应用开发语言:Java、Python、C#、Go
- 脚本语言:Shell、Perl、Ruby、Python(自动化任务、批处理)
- 数据科学语言:R、Python、Julia
- Web 前端语言:JavaScript、TypeScript
2. Shell 脚本编写与执行方式
Shell 脚本是解释型脚本语言,核心用途是批量执行命令、自动化任务、系统管理。
它不是单一语言,而是命令解释器(bash、zsh、dash)的脚本集合。
2.1 Shell 脚本结构
#!/bin/bash
# 这是一个示例脚本
echo "Hello, World!"
- Shebang(#!):指定脚本解释器(如
/bin/bash、/bin/sh) - 注释:
#开头 - 命令:系统命令、Shell 内置命令、用户自定义函数
2.2 脚本执行方式
方式 1:直接用解释器运行
bash script.sh
sh script.sh
- 优点:不依赖脚本可执行权限
- 缺点:必须显式指定解释器
方式 2:赋予可执行权限并运行
chmod +x script.sh
./script.sh
- 解释器由 shebang 决定
- 如果 shebang 是
/bin/bash,会用 Bash 执行 - 注意:当前目录必须加
./,否则 shell 不会从当前路径找
方式 3:source 执行(或 . 命令)
source script.sh
. script.sh
- 在当前 shell 环境执行,不会启动新进程
- 常用于加载环境变量或函数
- 区别:直接运行脚本是子进程执行,source 是当前进程执行
2.3 常见执行差异总结
| 方式 | 是否新进程 | 是否受可执行权限影响 | 解释器选择 |
|---|---|---|---|
bash script.sh | 是 | 否 | 命令指定 |
./script.sh | 是 | 是 | Shebang 指定 |
source script.sh | 否 | 否 | 当前 shell |
3. Shell 编程实用技巧
- 参数与位置变量
echo "第一个参数:$1"
echo "参数总数:$#"
- 判断条件
if [ -f "/etc/passwd" ]; then
echo "文件存在"
fi
- 循环
for file in *.txt; do
echo "$file"
done
- 函数
myfunc() {
echo "Hello $1"
}
myfunc "World"
4. 学习 Shell 的大纲建议
-
Shell 基础语法
- 注释、变量、运算符、转义字符
-
流程控制
- if、case、for、while、until
-
函数与作用域
- 定义、调用、局部变量
-
输入输出与管道
- stdin/stdout/stderr 重定向
-
字符串与数组处理
-
正则表达式与 grep/sed/awk
-
脚本参数与环境变量
-
调试与错误处理
set -x、trap
-
自动化任务
- cron、systemd timer
-
与系统交互
- 文件操作、进程管理、网络请求
全面解析 Shell:从历史渊源到高级技巧
Shell 是 Linux/Unix 世界里的“灵魂中介”,它既是命令行解释器,也是脚本语言,更是自动化的生产力工具。
你每天输入的每一条命令,几乎都要经过 Shell 的手。
1. 什么是 Shell
Shell 在英文里是“壳”的意思,形象地说,它是用户与内核之间的一层保护壳:
- 用户:只会发出命令(用人类能看懂的方式)
- Shell:把命令翻译成内核能理解的系统调用
- 内核:直接操作硬件,完成任务
在计算机体系结构中,Shell 主要是:
- 命令行解释器(Command-Line Interpreter)
- 脚本语言运行环境(Scripting Language Environment)
如果把 Linux 比作餐厅:
- 内核:厨师,真正做菜
- 用户:客人
- Shell:服务员,负责点单并送到后厨,还能帮你定套餐(脚本)
2. Shell 的发展与种类
Shell 不是单一的东西,它有很多“方言”,主要有:
- sh(Bourne Shell)
Unix 早期标准 Shell,几乎所有系统都有,脚本可移植性高。 - bash(Bourne Again Shell)
Linux 默认 Shell(GNU 项目产物),功能强大,支持命令补全、历史记录等。 - zsh(Z Shell)
交互体验优秀,可定制性强,搭配 oh-my-zsh 是程序员网红配置。 - ksh(Korn Shell)
企业级 Unix 常用 Shell,语法和功能介于 sh 与 bash 之间。 - fish(Friendly Interactive Shell)
现代交互式 Shell,语法简洁,自动建议功能很强。
3. Shell 的两大角色
3.1 交互式解释器
当你在终端输入一行命令:
ls -l /etc
Shell 会:
- 解析命令(词法/语法分析)
- 查找命令路径(PATH 环境变量)
- 创建子进程执行命令
- 等待命令执行结束并返回结果
3.2 脚本运行环境
Shell 脚本就是把命令按顺序写到文件里:
#!/bin/bash
echo "Backup start..."
tar czf backup.tar.gz /home/user
echo "Backup done."
运行时,Shell 会逐行解释执行这些命令,支持变量、条件判断、循环等控制逻辑。
4. Shell 脚本的核心要素
4.1 Shebang(#!)
告诉系统用哪个解释器执行:
#!/bin/bash
如果是:
#!/bin/sh
则使用系统默认的 Bourne Shell(在 Linux 上可能是 dash)。
4.2 变量
name="Tom"
echo "Hello, $name"
- 赋值时等号两边不能有空格
- 引用变量时
$name或${name} - Shell 中变量类型都是字符串,需要时用
let或$(( ))做数值运算
4.3 条件判断
if [ -f "/etc/passwd" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
-f检查是否为文件-d检查是否为目录-e检查文件是否存在
4.4 循环
for file in *.txt; do
echo "$file"
done
while read line; do
echo "$line"
done < file.txt
4.5 函数
greet() {
echo "Hello, $1"
}
greet "World"
$1表示第一个参数,$#表示参数个数
5. Shell 脚本的执行方式
| 执行方式 | 命令示例 | 是否新进程 | 可执行权限要求 |
|---|---|---|---|
| 直接用解释器 | bash script.sh | 是 | 否 |
| 赋可执行权限运行 | chmod +x script.sh && ./script.sh | 是 | 是 |
| source 执行 | source script.sh | 否 | 否 |
区别:
source在当前 Shell 环境执行,不会新建子进程,适合加载环境变量。
6. Shell 的优势与劣势
优势:
- 跨平台(几乎所有 Unix/Linux 系统都支持)
- 轻量、无需编译、快速开发
- 与系统命令无缝集成
劣势:
- 执行速度不如编译语言
- 调试能力有限
- 语法在不同 Shell 之间可能有差异
7. 高级玩法
- 命令替换:
today=$(date +%Y-%m-%d)
echo "Today is $today"
- 管道与重定向:
cat file.txt | grep "keyword" > result.txt
- 数组:
arr=("one" "two" "three")
echo ${arr[1]} # 输出 two
- 信号处理:
trap 'echo "Script interrupted"; exit' SIGINT
8. 学习路线建议
- 熟悉常用 Linux 命令
- 学会基本脚本结构(变量、条件、循环)
- 掌握输入输出重定向与管道
- 熟练用正则、grep、sed、awk 处理文本
- 学会调试(
set -x、trap) - 编写自动化任务脚本(配合 cron)
- 尝试写函数库和可复用脚本
- 探索 Bash/Zsh 的高级特性
9. 小结
Shell 是 Linux 运维、自动化、批处理的核心技能。
掌握它,不仅能节省大量重复劳动时间,还能让你与系统交互的效率提升数倍。
对很多资深工程师来说,Shell 甚至是运维自动化的第一语言。
764

被折叠的 条评论
为什么被折叠?



