一、什么是Shell脚本?
Shell脚本是一种用来自动化执行Linux/Unix命令的脚本程序,本质是包含一系列命令的文本文件。通过Shell解释器(如Bash)执行,可以完成文件操作、系统管理、任务自动化等复杂操作。
二、基础语法结构
1. 脚本声明(Shebang)
#!/bin/bash
echo "Hello World!"
- #! 称为Shebang,指定解释器路径
- 注释以 # 开头
- 建议使用 `#!/usr/bin/env bash` 增强兼容性
2. 执行权限
chmod +x script.sh # 添加执行权限
./script.sh # 执行脚本
三、核心语法规律
1. 变量操作
name="John" # 定义变量(等号无空格)
echo $name # 使用变量
readonly PI=3.14 # 只读变量
unset name # 删除变量
注:变量名区分大小写,推荐小写加下划线命名法(my_var)
2. 特殊变量
变量 | 说明 | 示例 |
$0 | 脚本名称 | echo "脚本名称: $0" |
$1 | 第一个参数 | echo "第一个参数: $1" |
$2 | 第二个参数 | echo "第二个参数: $2" |
$# | 参数个数 | echo "参数个数: $#" |
$@ | 所有参数(以字符串形式 | echo "所有参数: $@" |
$* | 所有参数(以单个字符串形式) | echo "所有参数: $*" |
$? | 上一个命令的退出状态码 | ls /nonexistent_file; echo "退出状态码: $?" |
$$ | 当前Shell进程的PID | echo "当前进程ID: $$" |
$! | 最后一个后台进程的PID | sleep 10 & echo "后台进程ID: $!" |
$_ | 上一条命令的最后一个参数 | ls -l /tmp/very_long_filename; echo "最后一个参数: $_" |
使用示例:创建一个名为 `test.sh` 的脚本,内容如下:
#!/bin/bash
echo "脚本名称: \$0"
echo "第一个参数: \$1"
echo "第二个参数: \$2"
echo "参数个数: $#"
echo "所有参数(以字符串形式): $@"
echo "所有参数(以单个字符串形式): $*"
ls /nonexistent_file
echo "上一个命令的退出状态码: $?"
sleep 10 &
echo "后台进程ID: $!"
ls -l /tmp/very_long_filename # 假设/tmp下有这个文件
echo "最后一个参数: $_"
echo "当前进程ID: $$"
执行脚本
chmod +x test.sh
./test.sh arg1 arg2 arg3
随后会有类似的输出效果(实际效果可能会因环境不同而不同)
脚本名称: ./test.sh
第一个参数: arg1
第二个参数: arg2
参数个数: 3
所有参数(以字符串形式): arg1 arg2 arg3
所有参数(以单个字符串形式): arg1 arg2 arg3
ls: cannot access '/nonexistent_file': No such file or directory
上一个命令的退出状态码: 2
后台进程ID: 12345
ls: cannot access '/tmp/very_long_filename': No such file or directory
最后一个参数: /tmp/very_long_filename
当前进程ID: 67890
四、流程控制
1. 条件判断
包括if,if else,if elif
(小声吐槽)个人认为发明shell脚本语法规律的人有点太草率了,无论是if fi的组合还是后面case esac的组合都让人感觉非常敷衍。。。
if [ $num -gt 10 ]; then
echo "大于10"
elif [ $num -eq 10 ]; then
echo "等于10"
else
echo "小于10"
fi
注:【 】前后一定要加空格
比较运算符:
- 数值比较:`-eq`, `-ne`, `-gt`, `-lt`
- 字符串比较:`==`, `!=`
- 文件判断:`-f`(文件存在), `-d`(目录存在)
case
#!/bin/bash
read -p "请选择操作 (start/stop/restart): " action
case "$action" in
start)
echo "启动服务..."
# 启动服务的命令
;;
stop)
echo "停止服务..."
# 停止服务的命令
;;
restart)
echo "重启服务..."
# 重启服务的命令
;;
*)
echo "无效的操作: $action"
;;
esac
2. 循环结构
for循环:
for i in {1..5}
do
echo "第$i次循环"
done
# 遍历文件
for file in *.txt
do
echo "处理文件: $file"
done
while循环:
count=1
while [ $count -le 5 ]
do
echo "计数: $count"
((count++))
done
五、函数与参数
1. 定义函数
function greet() {
local name=$1 # 局部变量
echo "Hello, $name!"
return 0
}
greet "Alice" # 调用函数
echo "返回值: $?"
2. 参数传递示例
#!/bin/bash
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "所有参数: $@"
echo "参数个数: $#"
详细示例可以跳转至上文 2.特殊变量 研究。
六、总结
Shell脚本的语法规律可归纳为:
1. 严格依赖空格格式(中括号附近要使用空格,但是使用如 ”$total=$firstnum + $secondnum“这种语句时切记不可在等号前后加空格,否则会显示无法找到命令)
2. 命令返回值驱动逻辑
3. 强调字符串处理能力
希望这篇指南能帮助您系统掌握Shell脚本编写!如有疑问欢迎评论区交流,共同学习进步。