Shell脚本学习笔记:从入门到变量(一)

前言

最近在看 Shell 脚本相关的内容,以下是我从入门到变量部分的整理笔记,内容有点多,但都是干货。

先从基础开始,再逐步深入。

一、Shell 脚本入门

1. Linux 如何控制硬件?

Linux 靠内核操作硬件(CPU、内存、磁盘、显示器),而我们用户通过 Shell 命令跟内核打交道。简单说,Shell 就是个传话筒。

null

2. Shell 是什么

  • 定义:Shell 是 Linux 的命令解释器,像 Windows 的 DOS,能敲命令干活。
  • 特点:不光是命令,还是一门编程语言,有变量、函数、逻辑控制,写成脚本就能批量跑。
  • Shell 脚本:把命令攒成文本文件(一般.sh结尾),这就是脚本,也叫 Shell 程序。

3. 为啥学 Shell?

手动敲命令太费劲,脚本一跑,批量处理,效率蹭蹭往上涨,管理 Linux 必备。

4. Shell 咋工作的?

  1. 输入命令。
  2. Shell 解析后丢给内核。
  3. 内核执行完,Shell 把结果显示出来。

5. Shell 解析器

  • 查支持的解析器cat /etc/shells
  • 常见类型
    • /bin/sh:老大哥,UNIX 最早的 Shell。
    • /bin/bash:Linux 默认,功能多,界面友好。
    • /sbin/nologin:禁止登录,服务用得多。
    • /bin/dash:轻量级,交互差点。
    • /bin/csh & /bin/tcsh:C 风格的 Shell。
  • 当前解析器echo $SHELL,一般是/bin/bash

二、Shell 脚本规范

  • 文件名:建议.sh结尾,一看就懂。

  • 首行:得写#!/bin/bash,指定用 bash 跑。

  • 注释

    • 单行#随便写
    • 多行
    :<<!
    # 这儿是注释1
    # 这儿是注释2
    !
    

三、入门案例:Hello World

目标

写个helloworld.sh,输出 hello world。

步骤

  1. 新建:touch helloworld.sh

  2. 编辑:vim helloworld.sh,写:

    #!/bin/bash
    echo "hello world"
    
  3. 保存退出(:wq)。

  4. 跑:sh helloworld.sh,屏幕上就刷出 hello world。

三种执行方式

  • sh helloworld.sh:用 sh 解析器跑。
  • bash helloworld.sh:用 bash 跑,差不多。
  • ./helloworld.sh:直接跑,得先加权限:chmod a+x helloworld.sh

区别:前两种不用权限,第三种得自己加 x。

四、多命令案例

需求

/root/itheima下建one.txt,写上 Hello Shell。

步骤

  1. 建目录:mkdir /root/itheima

  2. 新建脚本:touch batch.sh

  3. 编辑:

    #!/bin/bash
    cd /root/itheima
    touch one.txt
    echo "Hello Shell" >> one.txt
    
  4. 跑:sh batch.sh

  5. 看结果:cat /root/itheima/one.txt,输出 Hello Shell。

五、Shell 变量详解

1. 变量是啥?

变量就是存数据的临时容器,存在内存里,分三类:

  • 系统环境变量
  • 自定义变量
  • 特殊变量

2. 系统环境变量

  • 啥是系统变量:系统定义好的,共享给所有 Shell 用。
  • 配置文件
    • 全局/etc/profile/etc/profile.d/*.sh/etc/bashrc
    • 个人~/.bash_profile~/.bashrc
  • 咋看
    • env:只看环境变量。
    • set:全看,变量、函数都有。
  • 常用变量
    • PATH:命令搜索路径。
    • HOME:用户家目录(比如/root)。
    • SHELL:当前解析器。
    • PWD:当前路径。
    • HISTFILE:命令历史文件。
  • 自定义系统变量
    • 场景:想让所有 Shell 都能用某个变量,就写到/etc/profile里。
    • 步骤
      1. 编辑:vim /etc/profile
      2. 加一行:export VAR1="test"
      3. 生效:source /etc/profile
      4. 验证:echo $VAR1,输出 test。

3. 自定义变量

(1)局部变量
  • 定义name=value
  • 规则
    • 字母、数字、下划线,别数字开头。
    • 等号两边没空格。
    • 默认是字符串,想算数得转。
    • 值有空格加双引号。
  • 取值$name${name}(拼接用后者,比如echo "Hi ${name}")。
  • 删掉unset name
(2)常量
  • 定义readonly name
  • 特点:改不了。
(3)全局变量
  • 定义export name

  • 范围:当前脚本和子脚本都能用。

  • 案例

    • demo2.sh
    #!/bin/bash
    export VAR4="test"
    sh demo3.sh
    
    • demo3.sh
    #!/bin/bash
    echo $VAR4
    
    • sh demo2.sh,输出 test。

4. 特殊变量

  • $n:脚本参数,$0是脚本名,$1~$9是第 1 到 9 个参数,${10}及以上。

  • $#:参数个数。

  • $* & $@:所有参数。

    • 不加引号:一样,$1 $2 …。
    • 加引号"$*"是一整串,"$@"是列表,用 for 循环能看出区别:
    for i in "$@"; do echo $i; done
    
  • $?:上个命令返回值,0 是成功,非 0 是失败。

  • $$:当前 Shell 进程 ID,ps -aux | grep bash能对上。

  • 案例:玩特殊变量

    • demo4.sh
    #!/bin/bash
    echo "脚本名: $0"
    echo "参数1: $1"
    echo "参数2: $2"
    echo "参数10: ${10}"
    echo "参数个数: $#"
    echo "所有参数(\$*): $*"
    echo "循环\$@:"
    for i in "$@"; do echo $i; done
    
    • 跑:sh demo4.sh a b c d e f g h i j,看看效果。

5. Shell 环境深入

交互式 vs 非交互式
  • 交互式:敲命令,马上跑,跑完反馈。
  • 非交互式:脚本跑命令,不跟你聊。
登录 vs 非登录
  • 登录 Shell:要用户名密码,加载/etc/profile~/.bashrc
  • 非登录 Shell:直接跑,只加载~/.bashrc
测试
  • 加变量:/etc/profileexport VAR1=1~/.bashrcexport VAR2=2
  • 脚本demo1.shecho $VAR1 $VAR2
    • bash demo1.sh:只出 2。
    • bash -l demo1.sh:出 1 2。
切换环境
  • 直接登录:用户名密码进系统。
  • su user -l:切用户,加载登录环境。
  • bash:非登录环境。

六、总结

Shell 脚本入门到变量,内容不少:

  • 基础:命令、脚本、解析器。
  • 变量:系统变量管全局,自定义变量分局部和全局,特殊变量超实用。
  • 环境:登录和非登录区别得搞清楚,影响变量加载。

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

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

相关文章

Linux应用:进程间通信

linux的进程间通信概述 进程间通信&#xff08;IPC&#xff0c;Inter - Process Communication&#xff09;是指在不同进程之间进行数据交换和同步的机制。由于每个进程都有自己独立的地址空间&#xff0c;直接共享内存存在困难&#xff0c;因此需要专门的 IPC 机制来实现进程…

el-input 不可编辑,但是点击的时候出现弹窗/或其他操作面板,并且带可清除按钮

1.focus“getFocus”鼠标聚焦的时候写个方法&#xff0c;弹窗起来 getFocus(){ this.定义的弹窗状态字段 true;} 2.点击确定的时候&#xff0c;数值赋值到el-input的输入框,弹窗取消&#xff08;this.定义的弹段字端 false&#xff09; 3.但是会有个问题就是el-input 不可点…

Weblogic未授权远程命令执行漏洞复现

1 漏洞简介 Weblogic是Oracle公司推出的J2EE应用服务器&#xff0c;CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台&#xff0c;CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链&#xff0c;可通过一个GET请求在远程W…

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测&#xff01;五模型对比&#xff01;Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运…

20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3

stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3 2025/3/19 14:17 缘起&#xff1a;在荣品的PRO-RK3566开发板的buildroot系统下&#xff0c;在命令…

Git 使用笔记

参考链接&#xff1a; 创建版本库 - Git教程 - 廖雪峰的官方网站 Git使用教程,最详细&#xff0c;最傻瓜&#xff0c;最浅显&#xff0c;真正手把手教 - 知乎 命令使用 cd f: 切换目录到 F 盘 cd gitCxl 切换目录到 gitCxl 文件夹 mkdir gitCxl 创建新文件…

Xilinx系列FPGA视频采集转HDMI2.0输出,基于HDMI 1.4/2.0 Transmitter Subsystem方案,提供6套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我已有的 GT 高速接口解决方案我已有的FPGA图像处理方案 3、详细设计方案设计框图硬件设计架构FPGA开发板输入Sensor之-->OV5640摄像头动态彩条Video In To AXI4-S…

机器学习面试重点第二部分(动画版)

​ 目录 ​ 第一章、聚类算法 ​1.1 K-means 聚类 ​1.1.1 算法​编辑流程 1.1.2 优缺点 ​1.1.3 应用场景 ​1.2 层次聚类 ​1.2.1 算法流程 1.2.2 优缺点 ​1.2.3 应用场景 ​1.3 DBSCAN ​1.3.1 算法流程 1.3.2 优缺点 ​1.3.3 应用场景 1.3.4. 参数 ε&…

剑指Offer精选:Java与Spring高频面试题深度解析

一、Java底层核心机制 &#x1f525; 问题1&#xff1a;谈谈对Java的理解&#xff1f; &#x1f4cc; 核心技术特性 平台无关性 "一次编译&#xff0c;到处运行"&#xff1a;通过JVM实现跨平台兼容 字节码&#xff08;.class&#xff09;作为中间语言&#xff0c;…

RabbitMQ 集群降配

这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配&#xff08;滚动操作&#xf…

【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”&#xff1a;手把手玩转STM32的外部中断控制器&#xff08;EXTI&#xff09; 引言&#xff1a;为什么我们需要“中断”&#xff1f; &#xff08;类比生活场景&#xff1a;用“快递按门铃”解释中断的意义&#xff09; 想象一下&#xff1a;当你在…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面&#xff0c;循环播放视频。思路是直接调用gr.HTML插件实现&#xff0c;简单有效&#xff01;&#xff01;&#xff01; 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f; 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源&#xff08;使用切面拦截&#xff0c;使用注解&#xff09; 总结 资源权限控制 2.2. 需要有一个用户&#xff1b;&#xff08;从数据库查询用户&#xff09; 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…