实用指南:Linux Shell 脚本:从零到进阶的实战笔记

news/2025/9/29 18:44:53/文章来源:https://www.cnblogs.com/slgkaifa/p/19119318

实用指南:Linux Shell 脚本:从零到进阶的实战笔记

Linux Shell 脚本:从零到进阶的实战笔记


1. Shell 脚本是什么?怎么跑?


2. 变量与“弱类型”:赋值、拼接、位置参数

  • 赋值与替换

    • 赋值:name=value等号两边不能有空白
    • 使用:$name 才是“变量的值”,这叫变量替换
  • 类型

    • Shell 变量无需声明类型,默认按字符串理解,“用法决定类型”。
  • 位置参数

    • $0 脚本名;$1…$9 参数 1~9;${10} 表示第 10 个;$@/$* 表示“全部参数”(展开规则略有差异)。→(目录大纲中有“位置参数/退出状态”专节)

3. 常见运算与判断:算术/字符串/文件测试/逻辑


4. 分支控制:if / case / select

  • if/elif/else:典型登录校验;注意在 [[ ]] 中连写 &&

  • case:适合“多分支输入分发”;支持模式 * ? [ ] |

    case "$addr" in
    "changsha") echo "去长沙旅游"; echo "去长沙吃臭豆腐";;
    "beijing")  echo "去北京旅游"; echo "去北京故宫看三宫六院";;
    *)          echo "回家休息";;
    esac

    (语法与示例都在文档中)

  • select:交互式菜单(文档“目录”中列出),在需要“让用户选项”的场景很有用。


5. 循环:for(三种姿势)/ while / until

5.1 for 三连

5.2 while

  • 基础写法(文档给了 let(( )) 两个版本):

    s=0; i=1
    while (( i <= 100 )); do
    (( s += i )); (( i++ ))
    done
    echo "$s"

    break/continue 在 while/for 都可用)

5.3 until

  • 模板:until <条件>; do ...; done

  • 语义与 while 相反当条件为真时退出,否则继续循环。

    i=1
    until (( i >= 10 )); do
    echo "第$i 次循环"
    ((i++))
    done

    (文档特别标注了“条件为真时退出”这一点,容易误解)


6. 函数:两种定义、参数、返回值(return vs echo)

  • 定义两种写法function f {}f() {} 都可。示例里让用户输入数字并回显平方:echo $((num*num))

  • 参数$# 参数个数;$1/$2 访问各参数。示例演示“传入 Rock Tony,打印参数个数与每个值”。

  • 返回值

    • return 仅 0–255(超过会溢出):

      myFunc1(){ ((ret=$1+$2)); return $ret; }
      myFunc1 255 2; echo $?

      (第二次会溢出)

    • echo 可返回任意文本:

      myFunc2(){ ((ret=$1+$2)); echo "$ret"; }
      ret=$(myFunc2 255 2); echo "$ret"

      (用命令替换接收)

    • **多次 echo 的“只取最后一行”**技巧:

      myFunc(){ echo "China"; echo "ChangSha"; }
      ret=$(myFunc | tail -1)   # ret=ChangSha

      (文档明确给了“tail -1 取最后一行”的范式)


7. 递归:阶乘 & 目录 DFS

  • 阶乘(基线 + 递归步)

    fact() {
    if (( $1 <= 1 )); then echo 1
    else
    local tmp=$(( $1 - 1 ))
    local result=$(fact "$tmp")
    echo $(( $1 * result ))
    fi
    }
    read -p "请输入一个正整数:" num
    result=$(fact "$num")
    echo "$num 的阶乘为: $result"

    (用 local 隔离变量、用命令替换把子结果带回)

  • 递归遍历目录(DFS)

    list() {
    for fd in $1/*; do
    if [ -d $fd ]; then
    echo "$fd 是目录"
    list "$fd"
    else
    echo "$fd 是文件"
    fi
    done
    }
    list "/etc"

    (思路清晰:遇目录先打印再“下钻”;生产中可加引号、防空匹配、处理符号链接)


8. 数组:一维、从 0 开始、遍历与长度

  • 语法arr=(v1 v2 ... vn)成员用空格分隔,不用逗号;索引从 0 开始。

  • 示例

    data=(1 3 5 "长沙")
    echo "${data[0]}"            # 第 1 个
    echo "元素个数: ${#data[@]}" # 长度
    for item in "${data[@]}"; do echo "$item"; done

    (遍历必须用 "${arr[@]}",这点文档也点名强调)

  • 文档说明:Bash 原生只支持一维数组(关联数组属另一个概念,文档未展开)。


9. 文件 I/O:逐行写入与读取

  • 写文件(交互式追加)

    rm -rf users.txt
    while true; do
    read -p "请输入姓名: " name
    read -p "请输入电话: " tel
    echo $name $tel >> users.txt
    read -p "输入 exit 退出: " answer
    if [[ $answer == "exit" ]]; then break; fi
    done
    Exit 0   # ← 文档此处大小写写成 Exit,会报 “command not found”

    (逻辑 OK,但 Exit 应为 exit,且删文件不必 -r。示例原文如此,记录以便你对照)

  • 读文件(逐行解析成“数组”)

    fileName="users.txt"
    cat $fileName | while read item; do
    echo "读到数据:$item"
    array=($item)
    echo "一共有${#array[@]}个数据: "
    echo "第 1 个:${array[0]} 第 2 个: ${array[1]}"
    Done
    Exit 0

    说明:这段用于演示“按空白切分”后取前两个字段,但示例里把 done/exit 写成 Done/Exit(大小写错误);实际应为小写。


10. 常见易错点(结合文档示例逐条“排坑”)

  1. 大小写敏感done/exit 必须小写;示例中 Done/Exit 会报错。
  2. until 的语义:条件为真就退出;若一开始条件已真,循环体一次都不会进。
  3. 数组遍历:应使用 "${arr[@]}",否则含空格的元素会被拆裂。
  4. 文件测试加引号[ -z "$name" ],防止空值导致语法歧义。
  5. 逻辑与/或:在 [[ ]] 中连写 &&/|| 更稳;文档示例就是如此。
  6. return vs echoreturn 只能 0–255;要返回任意值,用 echo + 命令替换,并可 | tail -1 取最后一行。
  7. for + seq 的格式化:记住 %03g 之类的 -f 用法(补零、定宽)很实用。

11. 实战练习清单(边学边做)


12. 速查表(贴墙上)

  • 运行方式:bash script.sh / chmod +x && ./script.sh;Shebang 指定解释器。
  • 变量:a=1echo "$a";拼接:a="${a} China"
  • 判断:[[ $x == $y && -n "$z" ]];文件测试:-e/-f/-d/-r/-w/-x
  • 循环:for/while/untilbreak/continue 都支持;until 条件真时退出。
  • 函数:f(){ ... };参数 $#/$1…return 0–255;val=$(f) 接收 echo 值。
  • 数组:arr=(a b "长沙")${#arr[@]} 长度;"${arr[@]}" 遍历。
  • 文件 I/O:写 >>;读 while read;示例中 Done/Exit 大小写需改成小写才可运行。

结语

这份笔记基本把 PDF 里的知识点“结构化 + 实战化”整理了出来:入门要素(变量/判断/循环)函数与返回值的取舍递归与 DFS 思路数组与 I/O 的常见坑。配合上面的练习,你可以很快搭起稳妥的脚本骨架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决升级 Windows 11 24H2 后 NAS 共享无法显示的问题

问题原因 Windows 11 24H2 策略强制默认只能访问签名的 SMB 共享用户,并且不允许使用 不安全的来宾(Guest)登录 模式连接文件共享。 解决方法 终端管理员模式下依次运行: Set-SmbClientConfiguration -RequireSecu…

实用指南:汽车地带AutoZone EDI需求分析及对接指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

商城类电商购物APP网购原型——实战计划原型

商城类电商购物APP网购原型——实战计划原型2025-09-29 18:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

怎样登录建设银行官方网站楼盘网站建设方案

写在前面 考试顺便整理博文内容整理 使用 Ansible 部署 samba 客户端和服务端理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c…

【还未找到原题】宝石(GEM) - Harvey

【还未找到原题】宝石(GEM)题意 给定 \(m\) 对关系,表示 \(a\) 比 \(b\) 小,此时问最先确定每一个点的排名的关系最小编号,如果最后还未确定排名,则此点输出-1。 由于没有原题,给个样例: input: 4 4 2 4 3 1 4…

第八篇

今天是9月29日,今天是满课,上午上的是统一建模语言和算法与数据,下午上的是Java,收获颇丰,上午明白了链表的增删改查,下午Java练习了编程。

C# AStar 算法 - 实际应用

在基本实现中 我们的理想化 是方格坐标的,但是实际应用可能是跨点的坐标,所以需要以 路段为核心,并且路段也支持了 方向的限制。 如果处于转弯的话,也优化了转弯的权重,尽量少转弯。 其中距离计算可以根据需要自行…

nocobase 源码安装

Git 源码安装 0. 先决条件 请确保你已经:安装了 Git、Node.js 20+、Yarn 1.22.x 配置并启动了所需数据库 MySQL 8.0.17+、MariaDB 10.9+、PostgreSQL 10+ 任选其一1. 将 NocoBase 下载到本地 latest 版本 (main) 功能…

南宁网站推广系统怎么做网站缩略图

关注我们谈到 .NET 在中国的推广和发展&#xff0c;.NET 开发者求职就业及 .NET 企业招人用人的问题往往常被提及。初学者会担心学习 .NET 之后的就业问题&#xff0c;.NET 开发者在求职过程中没有足够多的渠道来获取 .NET 招聘信息&#xff0c;而与此同时&#xff0c;采用 .NE…

小城建设的网站东莞出行政策有变了

大模型撬动数据新质生产力&#xff0c; 我们重新解构了智能BI 作者 | 曾响铃 文 | 响铃说&#xff08;xiangling0815&#xff09; “超级人工智能将在‘几千天内’降临。” 最近&#xff0c;OpenAI 公司 CEO 山姆奥特曼在社交媒体罕见发表长文&#xff0c;预言了这一点。之前…

航司网站url后缀参数FECU分析

目录找一个目标url 下一个xhr断点换个思路查看一下网站资源加密参数分析a0_0x5ae5d7[0] 值分析a0_0x42e81e[8] 值分析a0_0x42e81e[9] 值分析a0_0x42e81e[10] 值分析a0_0x42e81e[2] 值分析a0_0x42e81e[3] 值分析a0_…

子网掩码完全指南:从入门到精通

在网络世界中,子网掩码就像是网络的邮政编码 📮,它决定了数据包应该留在本地还是发往远方。无论是家庭网络还是企业级架构,理解子网掩码都是网络管理的基础技能! 什么是子网掩码? 🤔 子网掩码(Subnet Mask)是…

Android 系统源码级进程保活全方案:从进程创建到后台防护 - 实践

Android 系统源码级进程保活全方案:从进程创建到后台防护 - 实践2025-09-29 18:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !im…

怎样围绕网站专题发展来做ppt怎么样做一个网站

题目大意&#xff1a;给一张无向图&#xff0c;找一条字典序最小的欧拉路径 题解&#xff1a;若图不连通或有两个以上的奇数点&#xff0c;则没有欧拉路径&#xff0c;可以$dfs$&#xff0c;在回溯时把这个节点加入答案 卡点&#xff1a;没有在回溯时加入答案&#xff0c;导致出…

微信群机器人API

微信群机器人API微信iPad协议,采用最新的ASE加密,以及最新的算法,iPad协议是一套微信个人号接口,基于web开发,它能实现微信中的百分之八十的功能,并辅助微信执行各种操作,提供了客户与微信个人号对接的能力,技…

网站建设价格多少钱如何查看wordpress是否启用关键词

在开源矢量数据库的世界里&#xff0c;有些名字因其性能、灵活性和健壮性而脱颖而出。 1. Milvus Milvus 由 Zilliz 推出&#xff0c;是一款高度可定制的开源矢量数据库&#xff0c;在处理大规模数据方面大放异彩。由于其出色的可扩展性&#xff0c;当你需要处理大量数据时&a…

中国观鸟记录的网站架构广州网站建设seo

前些天发的一个随笔中得知python做界面很强&#xff0c;加之以前也听说过&#xff0c;所以学习了一下&#xff0c;主要想看看python和C的互操作以取长补短。 化了大约4天时间草草看了《Python编程金典》&#xff0c;觉得思想和Java的差不多&#xff0c;面向对象的思想和机制都…

烟台网站建设方案报价完整开发网站需要什么

逻辑左移转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846647.html

【CF19E】Fairy - Harvey

题意 给定一个无向图,问删掉那条边使得给图可以变成一个二分图。 思路 回顾二分图的定义:不存在奇环的图。 由于不保证连通图,所以可以把整个图分成若干个连通块来考虑。若所有连通块都是二分图:则此时删掉哪一条边…

如何制作一个公司网站wordpress皮肤

在当今学术研究和论文写作领域&#xff0c;AI技术的应用越来越广泛。为了帮助研究人员和学生提高写作效率、提升论文质量&#xff0c;以下推荐四款免费的AI写论文文献网站&#xff0c;并特别介绍千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款功能强大且全面…