Shell学习(1/6) 教程-变量
一、教程
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
常见的 Shell 类型:
- Bash (Bourne Again Shell):是最常见的 Linux 和 macOS 默认 Shell,功能强大且易用。
- sh (Bourne Shell):经典的 Unix Shell,许多其他 Shell 都是基于它扩展的。
- zsh (Z Shell):功能强大的 Shell,比 Bash 更加灵活,支持自动补全和更强的脚本功能。
- fish (Friendly Interactive Shell):注重易用性和交互性,提供了丰富的提示和补全功能。
- csh (C Shell):语法和 C 语言类似,曾在一些早期的 Unix 系统中广泛使用。
第一个shell脚本
1.使用 nano 创建脚本
- 打开终端。
- 输入以下命令来创建并编辑脚本:
nano myscript.sh
3. 输入您的脚本内容。例如
#!/bin/bash echo "Hello, World!"
- 按
Ctrl + O保存文件,然后按Enter确认文件名。 - 按
Ctrl + X退出编辑器。
2. 赋予脚本执行权限
chmod +x myscript.sh
使脚本变为可执行文件。
3. 运行脚本
如果脚本位于当前目录:
./myscript.sh
如果脚本不在当前目录,您需要提供脚本的完整路径:
/path/to/myscript.sh
4. 运行结果
Hello, World!
二、Shell 变量
在 Shell 编程中,变量是用于存储数据值的名称。
变量名的命名须遵循如下规则:
- 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
- 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
- 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
- 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
- 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
- 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
1. 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
#!/bin/bash
my_name="xaye"
echo ${my_name}
echo $my_name
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,和Kotlin类似。
2. 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bashmyUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
运行脚本,结果如下:
./myscript.sh: line 4: myUrl: readonly variable
3. 删除变量
使用 unset 命令可以删除变量。语法:
unset variable\_name
变量被删除后不能再次使用。unset 命令不能删除只读变量。
#!/bin/shmyUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
执行将没有任何输出。
xaye@PS2022YZEUYRLD:/mnt/e/Android-NDK-C/sh$ ./myscript.shxaye@PS2022YZEUYRLD:/mnt/e/Android-NDK-C/sh$
4. 变量类型
4.1 字符串变量
存储字符或字符串,默认情况下 Shell 中的变量都被视为字符串类型。
name="Xaye"
greeting="Hello, ${name}!"
echo $greeting
- 不需要声明类型。
- 使用双引号可以防止空格或特殊字符被误解释。
- 使用单引号禁止变量替换。
4.2 数组变量
用于存储多个值(下标从 0 开始)。
定义:array=(value1 value2 value3)
访问元素:echo ${array[0]} # 输出第一个元素
操作数组:
获取所有元素: ${array[@]} 或 ${array[\*]}
获取数组长度: ${#array[@]}
示例:
colors=("red" "green" "blue")
echo ${colors[1]} # 输出 green
echo ${colors[@]} # 输出 red green blue
echo ${#colors[@]} # 输出 3
4.3 整数变量
用于存储和操作整数值(需要指定计算模式)。
num=42
算术运算:
使用 $((expression)) 进行整数运算。
num=$((5 + 10))
echo $num # 输出 15
增加或减少:
num=$((num + 1))
echo $num # 输出 16
注意:默认情况下,Shell 不支持浮点运算,可借助 bc 或其他工具实现。
4.4 环境变量
系统级变量,影响系统环境或子进程行为。
常见环境变量:
$PATH:可执行文件的搜索路径。$HOME:用户的主目录。$USER:当前登录的用户名。$SHELL:当前使用的 Shell 类型。
操作环境变量:
查看当前环境变量:
env
设置新的环境变量:
export VAR="value"
查看某个变量:
echo $VAR
4.5 特殊变量
Shell 内置的特殊变量,用于存储命令、脚本参数或运行状态信息。
- 常见特殊变量:
$0:当前脚本或命令名。$1, $2, ...:命令行参数。$@:所有参数(逐个分开)。$\*:所有参数(作为一个字符串)。$#:参数个数。$?:上一个命令的退出状态。$$:当前 Shell 的进程 ID。$!:最近运行的后台任务的进程 ID。
4.6 总结
| 类型 | 说明 | 示例 |
|---|---|---|
| 字符串变量 | 存储字符或字符串,Shell 默认变量类型。 | name="Alice";echo "Hello, $name!" |
| 数组变量 | 存储多个值,支持索引访问及操作。 | array=(val1 val2);echo ${array[0]} |
| 整数变量 | 存储和操作整数,支持算术运算。 | num=$((5 + 3));echo $num |
| 环境变量 | 系统级变量,影响系统环境或子进程。 | $PATH, $HOME, export VAR=value |
| 特殊变量 | 内置变量,用于存储命令、参数及状态信息。 | $@, $\*, $?, $$, $! |
5. Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
5.1 单引号
内容完全原样输出,变量或特殊字符不会被解析。
str='Hello $USER'
echo $str # 输出:Hello $USER
5.2 双引号
支持变量和特殊字符的解析。
name="Xaye"
greeting="Hello, $name!"
echo $greeting # 输出:Hello, Xaye!
5.3 拼接字符串
name="Xaye"
full_greeting="Hello, "$name"!"
echo $full_greeting # 输出:Hello, Xaye!
5.4 获取字符串长度
使用 ${#变量名} 获取字符串的长度:
str="Hello, World"
echo ${#str} # 输出:12
5.5 提取字符串
使用 ${变量名:起始位置:长度} 提取子字符串:
str="Hello, World"
echo ${str:7:5} # 输出:World
起始位置从 0 开始;如果只指定起始位置,则提取到字符串末尾。
echo ${str:7} # 输出:World
5.6 查找字符串
使用 expr index 或内置方法查找子字符串的位置。
示例 1: expr 方法:
str="Hello, World"
echo $(expr index "$str" W) # 输出:8
示例 2:内置查找:
str="Hello, World"
echo ${str%%W*} # 输出:Hello,
6. Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
6.1 定义数组
用括号 () 定义数组,数组元素用空格分隔。
arr=(value1 value2 value3)
单独赋值:可以为特定下标的元素单独赋值。
arr[0]="value1"
arr[1]="value2"
arr[2]="value3"
6.2 读取数组
读取单个元素:通过下标访问数组元素(下标从 0 开始)。
echo ${arr[0]} # 输出:value1
读取所有元素:使用 ${数组名[@]} 或 ${数组名[\*]}。
echo ${arr[@]} # 输出:value1 value2 value3
运行:
xaye@PS2022YZEUYRLD:/mnt/e/Android-NDK-C/sh$ ./myscript.sh
value1 value2 value3
6.3 获取数组的长度
语法: ${#数组名[@]}
echo ${#arr[@]} # 输出:3
示例代码
# 定义数组
fruits=("apple" "banana" "cherry")# 读取单个元素
echo ${fruits[1]} # 输出:banana# 读取所有元素
echo ${fruits[@]} # 输出:apple banana cherry# 获取数组长度
echo ${#fruits[@]} # 输出:3
7. Shell 注释
7.1 单行注释
使用 # 开头,表示该行的内容是注释,不会被执行。
# 这是一个单行注释
echo "Hello, World!" # 输出内容
7.2 多行注释
Shell 不支持原生的多行注释,但可以通过以下方法实现:
- 连续使用
#** 注释多行**:
# 这是第一行注释
# 这是第二行注释
# 这是第三行注释
- 使用
: ' ': + 空格 + 单引号 或: <<EOF ... EOF** 的方法**:
: '
这是第一行注释
这是第二行注释
这是第三行注释
'
<<EOF
这是第一行注释
这是第二行注释
这是第三行注释
EOF
相关文章:
Shell学习(1/6) 教程-变量
一、教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell…...
《Qt窗口动画实战:Qt实现呼吸灯效果》
Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...
RabbitMQ系列(六)基本概念之Routing Key
在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...
Spring Boot 集成 Kafka
在现代软件开发中,分布式系统和微服务架构越来越受到关注。为了实现系统之间的异步通信和解耦,消息队列成为了一种重要的技术手段。Kafka 作为一种高性能、分布式的消息队列系统,被广泛应用于各种场景。而 Spring Boot 作为一种流行的 Java 开…...
CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
浅析eBPF
目录 一、eBPF 原理 二、eBPF 已可投入使用的场景 三、eBPF 与 Jaeger/Zipkin 的区别及先进性 四、使用 eBPF 的开源软件 五、开源软件的局限性或待实现功能 猫哥说 一、eBPF 原理 eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间…...
HTML 基础 (快速入门)详细步骤和示例
目录 创建基本的 HTML 文件 添加内容到页面 页面布局与链接 HTML(超文本标记语言)是构建网页的基础技术,以下是 HTML 基础的详细步骤和示例: 创建基本的 HTML 文件 步骤一:新建文件 在本地计算机上选择一个合适的…...
力扣-动态规划-139 单词拆分
思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…...
建筑能耗监测系统数据采集装置 物联网网关功能参数介绍
安科瑞刘鸿鹏 摘要 随着物联网(IoT)技术的迅猛发展,现代物联网系统的规模和复杂度不断增加,各种智能设备和传感器的广泛应用为数据采集和分析提供了丰富的信息源。然而,面对不同协议、标准和通信方式的设备ÿ…...
vue深拷贝:1、使用JSON.parse()和JSON.stringify();2、使用Lodash库;3、使用深拷贝函数(采用递归的方式)
文章目录 引言三种方法的优缺点在Vue中,实现数组的深拷贝I JSON.stringify和 JSON.parse的小技巧深拷贝步骤缺点:案例1:向后端请求路由数据案例2: 表单数据处理时复制用户输入的数据II 使用Lodash库步骤适用于复杂数据结构和需要处理循环引用的场景III 自定义的深拷贝函数(…...
ES 删除index 的curl
以下是使用 `curl` 命令删除 Elasticsearch 索引的格式和示例: ### 基本格式 ```bash curl -XDELETE "http://<node-ip|hostname>:9200/<index-name>" ``` - `<node-ip|hostname>`:Elasticsearch 节点的 IP 地址或主机名。 - `<index-name&g…...
游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...
第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...
使用vscode导出Markdown的PDF无法显示数学公式的问题
我的硬件环境是M2的MacBook air,在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件,数学公式都是显示的源代码。 我看了许多教程,给的是这个方法:在md文件对应的html文件中加上以下代码:…...
前端系列之:Blob
Blob 与二进制 什么是二进制? 二进制是计算机数据的基本表示形式,只使用 0 和 1 两个数字来表示数值。任何类型的数据(无论是文本、图片、音频文件等)都可以通过二进制表示。 什么是 Blob? 全称 Binary Large Object&a…...
【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...
Apache Flink:实时数据流处理的终极武器
Apache Flink:实时数据流处理的终极武器 在当今这个数据驱动的世界,实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐,从物联网监控到网络安全,毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...
点云处理入门--PointNetPointNet++论文与代码详解
基础知识 点云数据: 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据,通常由一系列点组成,每个点包含其在三维空间中的坐标(如 x,y,z),有时还可能包含颜色、强度等附加信息。 介绍几种常…...
通过Nginx负载均衡+Keepalived实现业务高可用
通过Nginx负载均衡和Keepalived可以实现业务的高可用,以下是详细的实现步骤: 环境准备 假设我们有3台服务器,IP地址分别为: 服务器1(Nginx Keepalived 主节点):192.168.1.100服务器2&#x…...
Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化
Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化 1. 算子核心概念与分类体系 1.1 算子本质解析 延迟执行机制:转换算子构建DAG,行动算子触发Job执行任务并行度:由RDD分区数决定(可通过spark.default.parallelism全局配置)执行位置优化:基于数据本地性的…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
