【Linux】全面讲解 Shell 变量的那些事

news2024/11/16 1:35:55

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

Linux 专栏 | Docker 专栏 | Kubernetes 专栏


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)


目录

一、基本介绍

1、Shell 的概念

2、变量的概念

二、变量的数据类型

1、字符串(String)

2、整数(Integer)

3、数组(Array)

4、只读变量(Readonly)

三、变量的作用类型

1、环境变量

2、本地变量

3、位置变量

四、变量的相关操作

1、查看变量

2、变量特殊赋值

3、变量中字符串操作

4、环境变量持久化


一、基本介绍
1、Shell 的概念

在 Linux 系统中,Shell 是用户与内核之间交互的接口程序,为用户提供使用操作系统的接口,也被称为命令解释器。Shell 接收用户输入的命令,并将其转换为 Linux 系统可以理解的操作,最终通过调用相应的程序来完成这些操作。

2、变量的概念

在 Linux Shell 中,变量通常用于存储全局数据、局部数据或临时数据。

变量的一般定义格式如下:

<变量名>=<变量值>

# 示例:var=123

定义变量时,需要注意以下几点:

  • 等号(=)两边不能有空格,否则会出现 command not found 报错
  • 变量名区分大小写
  • 变量名中只能包含字母、数字、下划线,且不能以数字开头
  • 变量名中避免使用 Shell 关键字,如 if、then、for、do、done、while、case、function 等
  • 变量名中避免使用特殊符号和空格
  • 变量名中尽量使用大写字母表示常量
  • 变量值中如果包含空格,应当使用单引号 '' 或双引号 "" 将变量值括起来,作为字符串使用


二、变量的数据类型
1、字符串(String)

在 Linux Shell 中,字符串是最常用的数据类型,主要用于存储文本信息:

  • 变量值可以包含字母、数字、特殊符号和空格
  • 变量值可以用单引号 ''、双引号 "" 或不加引号

如果没有特别的声明,所有 Shell 变量在赋值后,其对应的变量值都是以字符串的形式存储的,即使变量值看起来是数字,因此以下变量定义都是等价的:

var=123
或
var='123'
或
var="123"

2、整数(Integer)

在 Linux Shell 中,可以使用 declare -i 或 let 命令将变量声明为整数,变量值只能包含数字。

declare -i var=123
或
let var=123

3、数组(Array)

在 Linux Shell 中,可以使用 declare -a 命令将变量声明为数组。

declare -a var=(1 2 3)

🔔 其中 var[0]=1,var[1]=2,var[2]=3

4、只读变量(Readonly)

在 Linux Shell 中,可以使用 declare -r 命令或 readonly 命令将变量声明为只读。

只读变量一旦赋值后,其变量值将不能被改变,再次赋值会出现 readonly variable 提示。

declare -r var=123
或
readonly var=123

🔔 此时执行 var=aaa,会出现 var: readonly variable 提示


三、变量的作用类型
1、环境变量

环境变量也称为系统变量,是一种全局变量,在当前 Shell 以及所有子 Shell 中均可以全局使用。

  • Linux 系统内置的环境变量如下
PATH         # 定义了系统搜索可执行文件的目录路径,多个目录通常用冒号 : 分隔
HOME         # 用户的主目录
SHELL        # 用户当前使用的 Shell 类型
USER         # 当前登录用户的用户名
LOGNAME      # 当前登录用户的用户名,与 USER 通常相同
HOSTNAME     # 系统主机名
LANG         # 设置系统的语言和字符编码
LC_ALL       # 同时设置语言和区域设置的所有类别
TERM         # 定义了终端类型,用于控制终端的外观和行为
PS1          # 定义了命令行提示符的格式
HISTSIZE     # 定义了历史命令列表的大小
MAIL         # 定义了邮件文件的路径,Shell 会检查这个文件是否有新邮件
PATH_INFO    # 在 CGI 脚本中,包含了请求的路径信息
SERVER_NAME  # 在 CGI 脚本中,包含了服务器的主机名
SERVER_ROOT  # 在 CGI 脚本中,包含了服务器的根目录
PWD          # 当前工作目录的完整路径
RANDOM       # 每次读取时都会提供一个随机数
SECONDS      # 自 Shell 启动以来经过的秒数
SHLVL        # 当前 Shell 层级,每启动一个新的 Shell,这个值就会增加
UID          # 当前用户的用户 ID
GID          # 当前用户的主组 ID
-------------------------------------------------------------
$0:表示当前执行的 Shell 脚本名称
$*:表示所有传递给 Shell 脚本或函数的参数
$@:表示所有传递给 Shell 脚本或函数的参数
$$:当前 Shell 的进程号
$?:表示上一个命令的退出状态
$#:表示当前 Shell 脚本位置参数的个数

🔔 $* 与 $@ 的区别:
1)不加双引号的时候,将传递参数通过空格分隔后进行循环遍历,没有区别
2)加双引号的时候
  a)$* 会将传递的参数作为一个字符串变量进行循环遍历
  b)$@ 会将传递参数通过空格分隔后作为多个独立变量进行循环遍历
  • 用户也可以通过 export 命令或 declare -x 命令声明自定义的环境变量
export NGINX_HOME="/etc/nginx"
或
declare -x NGINX_HOME="/etc/nginx"

2、本地变量

本地变量是一种局部变量,只在当前 Shell 以及脚本函数中可以使用,子 Shell 无法获取。

var=123
或在 Shell 脚本的函数中
local var=123

3、位置变量

位置变量通常用于为 Shell 脚本或函数传递所需的参数。

$1:表示传递给 Shell 脚本或函数的第 1 个参数
$2:表示传递给 Shell 脚本或函数的第 2 个参数
...
以此类推


四、变量的相关操作
1、查看变量
# 查看变量值
echo $var
或
echo ${var}           # 推荐方式
或
echo "${var}"         # 推荐方式,如果包含空格不容易出现异常

# 查看所有变量
env                   # 查看所有环境变量
或
export                # 查看所有环境变量,还可以显示环境变量的定义命令
或
set                   # 查看所有环境变量和自定义变量

🔔 env、export、set 比较:
# env 命令用于查看环境变量,或在执行命令时临时设置环境变量
# export 命令用于将 Shell 变量设置为环境变量,使其在子进程中可用
# set 命令用于查看和设置 Shell 变量,以及修改 Shell 的行为

2、特殊赋值
  • 可以将一个变量的值赋给另一个变量
var1=123
var2=$var1
  • 可以将 Shell 命令的执行结果赋值给一个变量
var=$(pwd)

3、变量值操作
# 替换字符串
${var/old/new}                    # 替换一个匹配的字符串
${var//old/new}                   # 替换全部匹配的字符串

# 删除字符串
${var/old}                        # 删除一个匹配的字符串
${var//old}                       # 删除全部匹配的字符串

# 变量赋值
${var:=value}                     # 设定默认值
${var:+value}                     # 临时赋值值
${var:-value}                     # 不赋值,仅打印

# 变换字符串
${var^}                           # 首字符大写
${var^^}                          # 所有字符大写
${var,}                           # 首字符小写
${var,,}                          # 所有字符小写

# 统计字符串长度
${#var}

# 样式匹配
${var#样式}          # 从前向后删除,匹配最短样式
${var##样式}         # 从前向后删除,匹配最长样式
${var%样式}          # 从后向前删除,匹配最短样式
${var%%样式}         # 从后向前删除,匹配最长样式

🔔 示例
tmp='hostname_192.168.0.1#031a2caf-cf56-44fa-af7a-6a4ab00456b3'
echo ${tmp#*#} 结果为:031a2caf-cf56-44fa-af7a-6a4ab00456b3
echo ${tmp%_*} 结果为:hostname

4、永久环境变量

直接在 Shell 中执行 export 命令自定义的环境变量,仅对当前用户、当前 Shell 生效,如果需要永久生效,需要修改配置文件。

# 方式一
# 在 ~/.bashrc 或 ~/.bash_profile 中添加
export NGINX_HOME="/etc/nginx"
🔔 仅对当前用户永久有效,需要重新打开 Shell 会话 或 执行 source 命令生效

# 方式二
# 在 /etc/bashrc 或 /etc/profile 或 /etc/environment 中添加
export NGINX_HOME="/etc/nginx"
🔔 对所有用户永久有效,需要重新打开 Shell 会话 或 执行 source 命令生效

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

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

相关文章

python中的循环结构

注意&#xff1a;range&#xff08;&#xff09;函数 累加和&#xff1a; 注意&#xff1a;if 下面如果有好几行&#xff0c;只执行一行 print必须和 for 开头相同格数 例题&#xff1a;水仙花数 注意在print语句中&#xff0c;一句好“ 。。。。。 ”后面必须有逗号然后再写变…

(八) 初入MySQL 【主从复制】

案例概况 在企业应用中&#xff0c;成熟的业务通常数据量都比较大 单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 &#xff0c;所以需要配置多台主从数据库服务器以实现读写分离来满足需求 一、主从复制原理 1.1、 MySQL的复制类型 基于语句的复制(STATEME…

C++11 的继续学习

1.lambda 我们如果想要给一个自定义的元素排序&#xff0c;那么应该怎么排呢 先举个例子&#xff1a; struct Goods {string _name; // 名字double _price; // 价格int _evaluate; // 评价Goods(const char* str, double price, int evaluate):_name(str), _price(price),…

等额本息等额本金

1、贷款计算器 2024年最新版房贷利率计算器_LPR利率计算器 (K JSON) 贷款计算器 2、等额本息 接下来&#xff0c;我们可以用Python编写一个函数来计算每月还款额&#xff1a; import pandas as pddef amortization_schedule(principal, annual_interest_rate, years):"…

MySQL事务执行过程

一、MySQL一个查询语句执行过程如下图&#x1f53d; MySQL客户端查询&#xff0c;经过查询缓存、解析器、查询优化器、查询执行引擎&#xff0c;通过API接口查询&#xff0c;经过存储引擎&#xff0c;获取数据返回给客户端。 二、事务执行过程如下图&#x1f53d; 1、MySQL客户…

【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程F900xr宝马摩托车提车交车仪式AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&a…

【变化检测】基于IFN建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、IFN模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/open-cd 使用情况&#xff1a;代…

00Mac 安装配置Python3虚拟环境(VirtualEnv、virtualenvwrapper扩展包)

文章目录 前言一、安装二、mac需要配置环境变量三、报错&#xff1a;workon: command not found 前言 本文主要记录&#xff0c;Mac 安装配置Python3虚拟环境&#xff08;VirtualEnv、virtualenvwrapper扩展包&#xff09;&#xff0c;windows直接执行命令即可&#xff0c;mac…

Arch - 演进中的架构

文章目录 Pre原始分布式时代1. 背景与起源2. 分布式系统的初步探索3. 分布式计算环境&#xff08;DCE&#xff09;4. 技术挑战与困境5. 原始分布式时代的失败与教训6. 未来展望 单体时代优势缺陷单体架构与微服务架构的关系总结 SOA时代1. SOA架构及其背景1. 烟囱式架构&#x…

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染&#xff1a;一项综述 文章目录 大规模语言模型的基准数据污染&#xff1a;一项综述摘要1 引言 摘要 大规模语言模型&#xff08;LLMs&…

C#/.NET/.NET Core优质学习资料

前言 今天大姚给大家分享一些C#/.NET/.NET Core优质学习资料&#xff0c;希望可以帮助到有需要的小伙伴。 什么是 .NET? .NET 是一个免费的、跨平台的、开源开发人员平台&#xff0c;用于构建许多不同类型的应用程序。 使用 .NET&#xff0c;可以使用多种语言、编辑器和库来…

Java中Date类型上的注解

在日常开发中&#xff0c;涉及到日期时间类型Date和常用的注解DateTimeFormat和JsonFormat java.util.Date; org.springframework.format.annotation.DateTimeFormat; com.fasterxml.jackson.annotation.JsonFormat; 一 Date类型字段不使用注解 Data AllArgsConstructor N…

C语言程序设计——数组(一)

一、一维数组的定义和引用 数组:是一组具有相同数据类型的数据的有序集合。 1.1一维数组的定义 定义格式为: 类型说明符 数组名[常量表达式]; eg: int a[10]; 表示定义了一个整形数组,数组名为a,此数组有10个元素。 注:①数组名定名规则和变量名相同,遵循标识符…

【C++】STL学习——list模拟实现

目录 list介绍list结构介绍节点类的实现迭代器的实现构造函数运算符重载--运算符重载运算符重载!运算符重载*运算符重载->运算符重载 const迭代器的实现多参数模板迭代器list函数接口总览默认成员函数构造函数1构造函数2构造函数3 析构函数拷贝构造函数赋值重载函数 迭代器b…

八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)

八&#xff0c;SpringBoot Web 开发访问静态资源(附详细源码剖析) 文章目录 八&#xff0c;SpringBoot Web 开发访问静态资源(附详细源码剖析)1. 基本介绍2. 快速入门2.1 准备工作 3. 改变静态资源访问前缀&#xff0c;定义为我们自己想要的4. 改变Spring Boot当中的默认的静态…

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext new ClassPathXmlApplicationContext("bean.xml"); } BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanFactory的功能相似&#xff0c;都是…

2024下学期学习总结加今日学习总结

Vue router Vue Router 是一个为 Vue.js 应用程序设计的官方路由管理器。它使你能够轻松地在 Vue 应用中实现页面导航&#xff0c;处理 URL 和视图的映射。 安装router 在运行框内输入 npm install vue-router4 //vue2专用 npm install vue-router3 //vue3专用 对router进…

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…

【验收交付体系文档】系统验收计划书,软件交付验收成套文档体系

软件系统验收计划书是确保新开发的软件系统符合预期要求并稳定运行的关键步骤。本计划书概述了验收过程的主要环节&#xff0c;包括系统功能的详细测试、性能评估、用户接受度测试以及文档完整性的核查。验收团队将依据项目需求规格说明书和合同要求&#xff0c;对系统进行全面…

axure判断

在auxre中我们也可以实现判断的功能&#xff0c;当目标等于什么内容时则执行下方的功能。 一、判断输入框中是否有值 画布添加一个输入框、一个文本标签删除其中内容&#xff0c;添加一个按钮&#xff0c;输入框命名为【文本显示】文本标签命名为【提示】 给按钮新增一个交互…