资讯动态

【Shell】Shell脚本(Bash):0基础完整教程

发布时间:2026/8/28 17:56:22 来源:尧图企业网站定制
Shell脚本Bash零基础完整教程Shell 就是 Linux/macOS 终端脚本把一堆命令写成文件实现自动化。Windows 可以用 WSL、Git‑Bash 运行。 本文全部示例可以直接复制运行重点标注新手高频坑点。0 准备环境Linux自带 bash直接打开终端macOS自带终端Windows安装 WSL2或者 Git‑Bash编辑器vim、vscode 均可脚本后缀一般为.sh第 1 课第一个 Shell 脚本 hello.sh新建文件hello.sh#!/bin/bash # 这是注释#开头程序忽略 echo Hello Shell!#!/bin/bashshebang必须写在第一行告诉系统用 bash 解释执行脚本稀土掘金。echo打印输出到屏幕。两种运行脚本方式# 方式1直接指定解释器不需要执行权限 bash hello.sh # 方式2加执行权限像程序一样运行推荐 chmod x hello.sh ./hello.sh./代表当前目录不能省略。第 2 课变量新手最大坑等号两边不能有空格定义变量name张三 # 赋值左右**严禁空格** age22取值$变量名或者${变量名}推荐大括号避免拼接出错echo $name echo ${age}单引号、双引号区别【必记】a10 echo $a # 单引号原样输出$不解析 → $a echo $a # 双引号解析变量 → 10把命令结果赋值给变量now$(date %Y-%m-%d) echo $now特殊内置变量脚本传参运行./test.sh apple banana变量含义$0脚本文件名$1 $2第 1、第 2 个参数$#传入参数总个数$全部参数最常用$?上一条命令退出码0 代表成功非 0 失败示例 test.sh#!/bin/bash echo 脚本名字$0 echo 第一个参数$1 echo 参数总数$# echo 全部参数$第 3 课输入输出、重定向、管道read 获取用户键盘输入read -p 请输入你的名字 username echo 你输入的名字是 $username重定向把输出写到文件CSDN博...# 覆盖清空文件再写 echo 第一行 log.txt # 追加末尾新增不覆盖 echo 第二行 log.txt # /dev/null 黑洞丢弃输出 ping 127.0.0.1 -c1 /dev/null管道|前一个命令输出作为后一个命令输入ps aux | grep bash # 查询bash进程 ls -l | wc -l # 统计文件行数第 4 课条件判断 if⚠️坑[ ]左右必须留空格if [ $a -gt 10 ]; then少空格直接报错。数值比较整数符号含义-eq等于 equal-ne不等于-gt大于-ge大于等于-lt小于-le小于等于#!/bin/bash num15 if [ $num -gt 10 ]; then echo 数字大于10 elif [ $num -eq 10 ]; then echo 等于10 else echo 小于10 fi文件判断if [ -f ./hello.sh ]; then echo hello.sh普通文件存在 fi [ -d /tmp ] # -d 判断是否目录 [ -e abc.txt ] # -e 判断路径是否存在字符串判断strabc if [ $str abc ]; then echo 字符串相等 ficase 分支多匹配#!/bin/bash read -p 输入start/stop op case $op in start) echo 启动服务 ;; stop) echo 停止服务 ;; *) echo 无效输入 ;; esac;;每个分支结尾不能少*)相当于 default 默认分支。第 5 课循环 for /whilefor 循环 1遍历列表#!/bin/bash for i in 1 2 3 4 5 do echo 数字 $i done简写数字范围for i in {1..10}遍历文件for f in *.sh do echo 脚本文件$f donewhile 循环条件成立就循环#!/bin/bash i1 while [ $i -le 5 ] do echo $i i$((i1)) donewhile 读取文件每一行高频while IFS read -r line do echo $line done hello.shbreak跳出整个循环continue跳过本次循环直接下一轮死循环while : do echo 死循环CtrlC终止 sleep 1 done第 6 课 Shell 函数你前面问的函数shell 函数封装一段逻辑脚本内部调用没有 return 返回数值只能返回退出码输出用 echo。语法func_name(){ # 函数体 # $1 $2 代表传给函数的参数不是脚本参数 }完整示例 func.sh#!/bin/bash add(){ a$1 b$2 echo $((a b)) } # 调用函数传参数 res$(add 3 5) echo 结果$resshell 函数不能直接return 8拿到计算结果return 只能返回 0‑255 退出码想要拿到运算结果用echo输出$()捕获。带局部变量用local避免污染全局变量calc(){ local x$1 local y$2 echo $((x*y)) }第 7 课 数组arr(apple banana orange) echo ${arr[0]} #取第一个元素 echo ${arr[]} #全部元素 echo ${#arr[]} #数组长度遍历数组for item in ${arr[]} do echo $item done第 8 课 调试脚本排错必备执行时加-x打印每一条执行命令排错神器bash -x hello.sh在脚本内部开启调试写脚本顶部#!/bin/bash set -x #开启调试 set -e #遇到命令失败直接退出脚本 set -u #未定义变量直接报错防止手敲变量名出错Shell 新手高频踩坑清单必看❌a 10→ ✅a10变量赋值等号两边不能空格❌if [$a -gt 10]→ ✅if [ $a -gt 10 ][后面、]前面必须空格字符串变量引用尽量加双引号$var文件名带空格不会炸$()优先不要用老反引号cmd函数return只能返回数字 0‑255输出结果用echo再$(func)捕获脚本路径用./xxx.sh不要直接写xxx.sh否则系统会去 PATH 找命令入门练习项目做完就入门备份脚本把指定目录打包文件名带上当前日期文件统计脚本统计目录下多少 txt、sh 文件ping 扫描脚本循环 ping 网段 IP输出哪些 IP 通简易计算器脚本读取用户输入两个数字调用函数做加减乘除学习路线建议先会终端基础命令 ls cd cp mkdir rm find grep学习变量、参数、if 判断for/while 循环写小脚本shell 函数数组进阶sed、awk文本三剑客正则

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价