Shell 脚本是一种在类 Unix 系统(如 Linux、macOS)中用来编写自动化任务的脚本语言。掌握 Shell 编程可以帮助你高效地管理系统、批量处理文件、执行定时任务等。
1. 什么是 Shell?
Shell 是一种命令行解释器,它为用户提供了与操作系统内核交互的界面。常见的 Shell 包括:
- Bash(GNU Bourne-Again Shell):最流行的 Shell。
- Sh(Bourne Shell):最基础的 Shell。
- Zsh:功能更强大,具有很多用户友好的特性。
- Ksh(Korn Shell):兼容 Bourne Shell,增加了一些扩展。
2. Shell 脚本的基本结构
Shell 脚本通常是一个文本文件,包含一系列命令。文件以 .sh
为扩展名。以下是一个简单的 Shell 脚本示例:
#!/bin/bash
# 这是一个简单的 Shell 脚本示例
echo "Hello, World!"
解释:
#!/bin/bash
:Shebang(井号感叹号),用于指定脚本使用的解释器路径。echo
:输出命令,用于在终端打印文本。
3. 创建和运行 Shell 脚本
- 创建脚本: 使用文本编辑器(如
vim
或nano
)创建一个新文件:
nano myscript.sh
将脚本内容输入并保存。
- 赋予执行权限:
chmod +x myscript.sh
- 运行脚本:
./myscript.sh
4. 变量
Shell 中的变量用来存储数据。变量名区分大小写。
定义变量:
name="Alice"
age=25
引用变量:
echo "Name: $name, Age: $age"
读取用户输入:
read user_input
echo "You entered: $user_input"
5. 特殊变量
Shell 提供了一些特殊变量,常用于脚本中:
$0
:当前脚本的名称。$1, $2, ...
:脚本接收的第一个、第二个参数。$#
:参数个数。$@
:所有参数。$?
:上一个命令的退出状态(0 表示成功)。
示例:
#!/bin/bash
echo "Script name: $0"
echo "First parameter: $1"
echo "Number of parameters: $#"
6. 运算符与计算
Shell 支持基本的算术操作。使用 expr
或 $((...))
进行计算。
示例:
a=5
b=3
sum=$((a + b))
echo "Sum: $sum"
7. 控制结构
7.1 条件判断(if 语句)
基本语法:
if [ condition ]; then# 条件为真时执行
elif [ another_condition ]; then# 另一个条件为真时执行
else# 其他情况
fi
示例:
#!/bin/bash
read -p "Enter a number: " num
if [ $num -gt 10 ]; thenecho "Number is greater than 10"
elseecho "Number is 10 or less"
fi
常用条件判断:
-eq
:等于-ne
:不等于-gt
:大于-lt
:小于-ge
:大于等于-le
:小于等于
7.2 循环(for、while)
for 循环:
for i in 1 2 3 4 5; doecho "Number: $i"
done
while 循环:
counter=1
while [ $counter -le 5 ]; doecho "Counter: $counter"counter=$((counter + 1))
done
8. 函数
函数用于封装代码块,提高脚本的可复用性。
定义函数:
my_function() {echo "This is a function"
}# 调用函数
my_function
带参数的函数:
greet() {echo "Hello, $1"
}greet "Alice"
9. 常用命令
- 文件操作:
ls # 列出文件
cp src dest # 复制文件
mv old new # 重命名或移动文件
rm file # 删除文件
- 文本处理:
cat file # 查看文件内容
grep "pattern" file # 查找文本
awk '{print $1}' file # 处理文本
- 系统管理:
ps # 查看运行的进程kill PID # 终止进程df -h # 查看磁盘使用情况
10. Shell 脚本调试
调试脚本时可以使用 -x
选项输出每条命令的执行情况:
bash -x myscript.sh
11. 脚本示例
批量重命名文件:
#!/bin/bash
for file in *.txt; domv "$file" "${file%.txt}.bak"
done
自动备份:
#!/bin/bash
backup_dir="/backup"
mkdir -p $backup_dir
cp -r /home/user/data $backup_dir
echo "Backup completed"