Shell 是 Unix/Linux 系统的命令行解释器,既是交互式终端,也是一门脚本语言。Bash(Bourne Again Shell)是目前最广泛使用的 Shell 实现。
基础语法
Shell 脚本以 shebang 开头,声明解释器:
1 2 3 4 5 6
| #!/bin/bash
echo "Hello, $(whoami)!" echo "当前时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "系统内核: $(uname -r)"
|
变量与字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #!/bin/bash
name="RustBoy" version=1
echo "欢迎 ${name} v${version}"
str="Hello, World!" echo "长度: ${#str}" echo "切片: ${str:0:5}" echo "替换: ${str/World/Rust}"
files=$(ls -la | wc -l) echo "当前目录有 ${files} 个条目"
|
条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/bin/bash
file="/etc/passwd"
if [ -f "$file" ]; then echo "$file 存在" elif [ -d "$file" ]; then echo "$file 是目录" else echo "$file 不存在" fi
name="root" if [ "$name" = "root" ]; then echo "当前是 root 用户" fi
count=10 if [ "$count" -gt 5 ]; then echo "大于 5" fi
if (( count > 5 )); then echo "大于 5" fi
|
循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #!/bin/bash
for file in *.md; do echo "处理: $file" wc -l "$file" done
for ((i = 0; i < 5; i++)); do echo "第 $i 次" done
counter=0 while [ $counter -lt 5 ]; do echo "计数: $counter" ((counter++)) done
cat /etc/passwd | while IFS=: read -r user _ uid gid _ home shell; do echo "用户: $user, UID: $uid, Shell: $shell" done
|
函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #!/bin/bash
backup() { local src="$1" local dest="$2" local timestamp=$(date '+%Y%m%d_%H%M%S')
if [ ! -d "$src" ]; then echo "错误: $src 不存在" >&2 return 1 fi
tar -czf "${dest}/backup_${timestamp}.tar.gz" "$src" echo "备份完成: ${dest}/backup_${timestamp}.tar.gz" return 0 }
backup "/home/user/documents" "/tmp/backups" if [ $? -eq 0 ]; then echo "备份成功" fi
|
实用脚本示例
批量重命名文件的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
dir="${1:-.}" count=0
for file in "$dir"/*.jpeg; do [ -f "$file" ] || continue new_name="${file%.jpeg}.jpg" mv "$file" "$new_name" echo "重命名: $file -> $new_name" ((count++)) done
echo "共处理 $count 个文件"
|
系统监控脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/bin/bash
echo "========== 系统状态 ==========" echo "主机名: $(hostname)" echo "运行时间: $(uptime -p)" echo "" echo "--- CPU 使用率 ---" top -bn1 | grep "Cpu(s)" | awk '{print "使用率: " 100 - $8 "%"}' echo "" echo "--- 内存使用 ---" free -h | awk '/^Mem:/ {printf "已用: %s / 总计: %s (%.1f%%)\n", $3, $2, $3/$2*100}' echo "" echo "--- 磁盘使用 ---" df -h / | awk 'NR==2 {printf "已用: %s / 总计: %s (%s)\n", $3, $2, $5}'
|
Shell 的局限
Shell 适合做胶水语言——把各种命令行工具串联起来。但面对复杂逻辑、大量数据处理、跨平台需求时,应该选择 Python 或其他通用语言。
与 Rust 的典型配合:用 Shell 编写构建脚本和 CI 流程,用 Rust 编写实际的工具和应用程序。