掌握Shell脚本:从入门到精通

发布时间:2026/5/24 18:56:48

掌握Shell脚本:从入门到精通 引言在前面的文章中我们已经学习了 Linux 环境下的各种开发工具。Shell 脚本是连接这些工具的胶水——它能将系统命令、条件判断、循环和函数组合起来实现自动化任务。Shell 脚本属于解释型语言无需编译由解释器如 bash逐行解释执行。这使得它在系统管理、持续集成、日志分析等场景中不可替代。第一部分基础语法一、脚本的基本结构#!/bin/bash# 首行必须声明解释器shebang# # 开头的行为注释echo Hello World执行方式# 方式1显式调用解释器 bash myscript.sh # 方式2授权后直接执行 chmod ux myscript.sh ./myscript.sh二、变量1. 变量定义与取值# 定义等号两边不能有空格 a100 strhello world str2single quote # 取值必须用 $ 前缀 echo $a # 100 echo $str # hello world # 变量间赋值 s$a echo $s # 1002. 单引号 vs 双引号引号类型特点示例双引号允许变量替换echo $a→100单引号强引用原样输出echo $a→$a无引号仅适用于无空格字符串a100nameworld echo hello $name # hello world双引号解析变量 echo hello $name # hello $name单引号不解析3. 从键盘读取read -p 请输入你的名字 name echo 你好$name4. 变量分类第二部分条件判断一、test 命令与中括号条件判断有两种等效写法test $a 1 # test 命令 [ $a 1 ] # 中括号注意空格空格规则非常重要# ✅ 正确 [ $a 1 ] # ❌ 错误缺空格会导致语法错误 [$a1]二、三种测试类型测试类型运算符说明示例字符串、!、-z、-n判等/判空[ $str abc ]数值-eq、-ne、-gt、-ge、-lt、-le等于/不等/大于/大于等于/小于/小于等于[ $n -gt 100 ]文件-f、-d、-x、-r、-e普通文件/目录/可执行/可读/存在[ -f /path ]注意数值比较不能用和必须用-gt、-lt等。三、if 语句# 单分支 if [ $input ABC ]; then echo 相等 fi # 双分支 if [ $num -gt 100 ]; then echo 大于100 else echo 小于等于100 fi # 多分支 if [ -d $file ]; then echo $file 是目录 elif [ -f $file ]; then echo $file 是普通文件 else echo $file 不存在 fi语法要点if和then在同一行时用;分隔必须以fi结束四、逻辑与和逻辑或# 逻辑与两个条件都满足 [ $n -ge 0 ] [ $n -le 100 ] # 逻辑或两个条件满足其一 [ $n -lt 0 ] || [ $n -gt 100 ]第三部分循环结构一、while 循环# 密码验证3次机会 i1 while [ $i -le 3 ]; do read -p 请输入密码 input if [ $input 123 ]; then echo 密码正确 break fi let i1 done if [ $i -gt 3 ]; then echo 次数超限退出 exit 1 filet命令用于算术运算let i1等价于i$((i1))。二、for 循环# 遍历列表 for item in apple banana orange; do echo $item done # 遍历数值范围 for i in {1..5}; do echo $i done三、循环对比循环类型执行条件语法while条件为真时执行while [ condition ]; do ... doneuntil条件为假时执行until [ condition ]; do ... donefor遍历列表for var in list; do ... done第四部分case 语句read -p 输入 yes 或 no input case $input in yes|y|Y|YES) echo 你选择了是 ;; no|n|N|NO) echo 你选择了否 ;; *) echo 输入无效 ;; esac语法要点以case开头esac结尾每个分支以)分隔每个分支结束用;;双分号*匹配所有其他情况|表示或如yes|y|Y第五部分函数一、函数定义与调用# 函数定义建议放在脚本最前面 fun() { echo 这是一个函数 } # 函数调用 fun二、函数传参my_add() { echo 参数个数$# echo 第一个参数$1 echo 第二个参数$2 return $(($1 $2)) } # 传参调用 my_add 3 5 echo 返回值$? # 8$? 获取上一条命令的返回值函数参数和脚本参数是独立的在函数内$1是函数的参数在函数外$1是脚本的参数三、函数内的变量作用域my_func() { local local_var只在函数内有效 # 局部变量 global_var整个脚本都能用 # 全局变量 } my_func echo $local_var # 空函数外不可见 echo $global_var # 整个脚本都能用关键字作用域默认无修饰全局脚本任意位置可访问local仅函数内有效unset删除变量第六部分脚本互调一、直接调用独立进程# a.sh echo A 脚本 PID$$ ./b.sh # 启动新解释器执行 b.sh./b.sh会启动一个新的 bash 进程两个脚本的$$进程 PID不同。二、点命令调用同一解释器# a.sh echo A 脚本 PID$$ . ./b.sh # 或 source ./b.sh三、调用方式对比调用方式解释器变量共享适用场景./b.sh新进程❌ 不共享独立任务. ./b.sh或source同一进程✅ 共享共享变量、配置./b.sh $var新进程通过参数传递传特定数据四、传参与环境变量# a.sh mySTRhello ./b.sh $mySTR # 通过参数传递 # b.sh echo $1 # 输出 hello# 环境变量方式 export mySTRhello # 将变量升级为环境变量 ./b.sh # 子进程自动继承环境变量 echo $mySTR # b.sh 中可以直接使用五、C 语言调用 Shell 脚本#include stdio.h #include unistd.h int main() { printf(C 程序 PID%d\n, getpid()); // execl 替换当前进程为脚本解释器 execl(./b.sh, b.sh, NULL); // 以下代码不会执行进程已被替换 return 0; }反向调用Shell 调 C 程序更简单——直接在脚本中写可执行文件路径即可和调用ls、grep等系统命令完全一样。第七部分完整示例#!/bin/bash # 学生成绩管理系统 # 函数定义 check_grade() { local score$1 if [ $score -ge 90 ]; then echo 优秀 elif [ $score -ge 80 ]; then echo 良好 elif [ $score -ge 60 ]; then echo 及格 else echo 不及格 fi } # 主逻辑 echo 学生成绩管理系统 while true; do read -p 请输入分数输入-1退出 score # 输入验证 if [ $score -1 ]; then echo 退出系统 break fi # 数值范围检查 if [ $score -lt 0 ] || [ $score -gt 100 ]; then echo 分数必须在 0~100 之间 continue fi # 调用函数判定等级 grade$(check_grade $score) echo 成绩等级$grade done总结一、核心语法速查语法写法变量定义a100等号不能有空格变量取值$a或${a}if 语句if [ 条件 ]; then ... fiwhile 循环while [ 条件 ]; do ... donefor 循环for var in list; do ... donecase 语句case $var in 值) ... ;; esac函数func() { ... }调用脚本./b.sh独立进程 或. ./b.sh同一进程二、常见错误错误正确写法[$a1][ $a 1 ]空格a 100a100等号不能有空格if [$a1] thenif [ $a 1 ]; then$1不解析用双引号$1三、一句话记忆Shell 脚本通过变量存储数据、if/while/case控制流程、函数封装逻辑、./b.sh独立进程或. ./b.sh同一进程调用其他脚本是连接 Linux 系统命令的自动化工具。

相关新闻