linux shell从入门到精通(二)——变量操作

1.什么是变量

  变量在许多程序设计语言中都有定义,与变量相伴地有使用范围地定义。Linux Shell也不例外。变量,本质上就是一个键值对。例如:

str=“hello”

  就是将字符串值“hello”赋予键str。在str地使用范围内,我们都可以用str来引用“hello”值,这个操作叫做变量替换。

2.Linux Shell中的变量

  Shell变量的名称以一个字母或下划线符号开始,后面可以接任意长度的字母、数字或下划线。和许多其它程序设计语言不同的是,Shell变量名称字符并没有长度限制。Linux Shell并不对变量区分类型。一切值都是字符串,并且和变量名一样,值并没有字符长度限制。神奇的是,bash也允许比较操作和整数操作,其中关键因素是,变量中的字符串值是否为数字。
例1

#! /bin/sh
long_str="Linux_Shell_programming"
echo $long_str

  例2

#! /bin/sh
add_1=100
add_2=200
echo $((add_1+add_2))

  由例1例2的输出“Linux_Shell_programming”和“300”可见,虽然Linux Shell中的变量都是字符串类型的,但是同样可以执行比较操作和整数操作,,只要变量字符串值是数字。
变量赋值的方式为:变量名称=值,其中“=”两边不要有任何空格。当你想使用变量名称来获得值时,在名称前加上$。例如:$long_str。
当变量裸体出现的时候(没有$前缀的时候),变量可能存在如下几种情况:

  1. 变量被声明或被复制
  2. 变量被unset
  3. 变量被export

  被一对双引号(“”)括起来的变量替换是不会被阻止的。所以双引号被称为部分引用,有时又被称为“弱引用”。但是如果使用单引号的话(‘’),那么变量替换就会被禁止了,变量名只会被解释成字面的意思,不会发生变量替换。所以单引号被称为“全引用”,有时候也被称为“强引用”,例如:

#! /bin/sh
var=123
echo '$var' 
echo "$var"

  在这个例子中,单引号中的$var没有替换成变量值123,也就是说,变量替换被禁止了;而双引号中的$var发生了变量替换。
在Shell的世界里,变量值可以是空值(“NULL” 值),就是不包含任何字符。这种情况很常见,并且也是合理的。但是在算术操作中,这个未初始化的变量常常看起来是0。但是这是一个未文档化(并且可能是不可移植)的行为。

#! /bin/sh
echo "$uninit" ## 没有输出let "uninit += 5"
echo "$uninit" ##输出为5

3.全局变量和局部变量

  顾名思义,局部变量的可见范围是代码块或函数中,这一点与大部分编程语言是相同的。但是,局部变量必须明确以local生命,否则即使在代码块中,它也是全局可见的。
环境变量是全局变量的一种,全局变量在全局范围内可见,在声明全局变量时,不需要加任何修饰词。
下面看一下这个例子:

#! /bin/sh
num=123func1()
{
num=321
echo $num
}func2()
{
local num=456
echo $num
}echo $num
func1
echo $num
func2
echo $num

  这个程序的输出结果为:

123 ##初始值
321 ##func1内被改变
321 ##func1内的赋值影响到函数体外
456 ##func2内声明局部变量
321 ##函数体外的num未改变
  • 我们设置了一个变量num,初始值赋值为123
  • 调用func1,func1中的赋值命令num=321将num=123覆盖。注意,此处虽然位于函数体内,但是还是能够修改全局变量,此处的num变量就是全局环境中的num
  • 调用func2,func2中定义了局部变量num,并且赋值456,在func2内部,num变量的值为456,此时为局部的;当func2返回后,回到全局作用区,此时num的值并未改变,为321

4.用echo输出变量

  echo命令的任务就是输出一行文本,多用于提示用户或产生数据,我们将在echo的manpage中显示更多选项。

语法:
echo [OPTION] … [STRING] …
描述:
允许在标准输出上显示STRING
主要选项:
-n 不输出行尾的换行符
行为模式:
echo将各个参数打印到标准输出,参数间以一个空格隔开,在输出结束后,换行,它会解释每个字符串里的转义序列,转义序列可以用来表示特殊字符,以及控制其行为模式
警告:
echo命令的-n选项并不被所有Linux版本支持,POSIX标准中并未包含此选项

  转义字符可以表示程序中难以看得见或者难以食醋胡的特殊字符,当echo遇到转义序列时,就会打印相应的字符,echo支持的转义字符如下表:

序列描述
\a报警符,ACSII的BEL字符
\b退格符
\c禁止尾随,这个字符后面的所有字符
\f换页符
\n换行符
\r回车符
\t水平制表符
\v垂直制表符
\反斜线

5.环境变量的相关操作

  在通常情况下,每个进程都有自己的“环境”,这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,Shell与一般的进程没什么区别。
每次当一个Shell启动时,它都将创建适合于自己环境变量的Shell变量,更新或者添加一个新的环境变量的话,这个Shell都会立刻更新它自己的环境(换句话说,更改或添加的变量会立即生效),并且所有后继生成的Shell子进程(即这个Shell所执行的命令)都会继承这个环境
如果一个脚本要设置一个环境变量,那么需要将这些变量“export”出来,也就是需要同之到脚本本地的环境,这是export命令的功能。
一个脚本只能够export变量到这个脚本所产生的子进程,也就说只能够对这个脚本所产生的命令和进程起作用。如果脚本是从命令行中调用的,那么这个脚本所export的变量是不能影响命令行环境的。也就是说,子进程不能够export变量来影响产生自己的父进程的环境的。但是,当使用source命令执行脚本时,因为没有子进程的产生,此时脚本中的export命令将会影响父进程的环境。

语法:
export [-fnp][变量名称=变量设置值]
描述:
export命令用于设置或显示环境变量
主要选项:
-f 代表[变量名称]中的函数名称
-n 删除指定的变量,变量实际上并未删除,只是不会输出到后续指令的执行环境中
-p 列出所有的Shell赋予程序的环境变量
行为模式:
export命令修改当前Shell进程的环境变量,若将export命令置于脚本中被调用执行,则export命令对父Shell进程的环境变量没有影响
警告:
Shell中执行程序时,Shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登录操作

  export命令用于设置当前进程的环境变量,但是有效期仅维持到当前进程消亡位置。下次重新登陆到命令行shell时,以前对Shell的export设置都无法恢复。如果想要把对环境变量的设置永久保存,则可以将export命令置于Shell登录时执行的启动文件中
启动文件包含别名和环境变量,正是这些别名和环境变量才使得Shell可以作为一个用户Shell来运行,当系统初始化之后,这些别名和变量也可被其他的Shell脚本调用。

启动文件/登出文件描述
/etc/profile系统范围的默认值,大部分用来设置环境(所有的sh衍生出的Shell适用)
/etc/bashrc特定于bash的,系统范围的函数与别名
$HOME/.bash_profile用户定义的,环境默认设置,在每个用户的home目录下都可找到(本地副本保存在/etc/profile)
$HOME/.bashrc用户定义的bash初始化文件,可以在每个用户的home目录下找到(本地副本保存在/etc/profile)。只有交互式的Shell和用户脚本才会读取这个文件。
$HOME/.bash_logout登出文件,用户定义的指令文件,在每个用户的home目录下找到。在登出(bash)Shell的时候,这个文件中的命令就会得到执行

  注意,此处 $HOME为环境变量, $HOME变量的值是登录者的用户目录,$HOME目录下存放有许多用户个人相关的文件和数据,还有对用户定制的配置文件。这些配置文件往往以“.”开头。

6.环境变量的env命令

  export命令设置适用于当前Shell的环境变量值,修改后维持不变,直到当前Shell消亡。env命令则可以临时改变环境变量值
“-i”选项使Shell在执行echo.s时,清空所有由父Shell继承来的环境变量,仅仅设置命令中指定的PATH变量(将“./”也添加到命令搜寻路径里)。这样,在执行echo.sh时,就不需要给出完全路径(./echo.sh),直接给出命令文件名,系统就知道在哪里找该命令了。

语法:
env [OPTION] … [-] [NAME=VALUE] … [COMMAND [ARG]…]
描述:
在重建的环境中运行程序,设置环境中的每个NAME为VALUE,并且允许COMMAND。
主要选项:
-i,–ignore-environment
不带环境变量启动
-u,-unset=NAME
从环境变量中删除一个变量
行为模式:
未提供COMMAND时,显示环境中所有变量的名称和值。提供COMMAND时,根据参数重建环境变量后,在新的环境中允许COMMAND

  Env函数和set函数不同,Envv函数显示的时环境变量,而set函数则显示所有的本地变量,包括利用用户的环境变量。例如,当用户在命令行中设置var=123时,set函数将显示var变量,而env函数则不显示(var此时是本地变量,不是环境变量)。如果使用export var=123命令,则set命令和env命令都可以显示var变量。

7.环境变量的unset命令

  unset命令从当前shell删除函数或变量,删除变量时,使用“-v”选项,删除函数时,使用“-f”选项。

语法:
unset [-v] variable…
unset -f function…
描述:
从当前Shell删除变量或函数
主要选项:
-f
删除指定的函数
-v
删除指定的变量。在没有提供任何选项的情况下,默认此选项
行为模式:如果没有提供任何选项,则默认unset为删除变量(-v选项)。如果使用-f选项,则被视为删除函数操作,参数为函数名称。

8.Shell中一些常用的环境变量

  Linux是一个多用户的操作系统,每个用户登录系统后,都会有一个专用的运行环境。通常用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。

变量名描述
HOME用户的专属目录,在linux中用“~”扩展
PATH外部命令的搜索路径
HISTSIZE保存历史命令记录的条数
LOGNAME当前用户的登录名
LOGNAME当前用户的登录名
HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得
SHELL当前用户使用的shell类型
LANG/LANGUAGE语言相关的环境变量,使用多种语言的用户可以修改此环境变量
MAIL当前用户的邮件存放目录
PS1/PS2PS1是基本提示符,对于root用户是"#“,对于普通用户是是”$“。PS2是专属提示符,默认是”>"。可以通过修改此环境变量来修改当前的命令符

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

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

相关文章

[Linux入门] 初学者入门:Linux DNS 域名解析服务详解

目录 一、域名服务基础:从 “名字” 到 “地址” 的转换 1️⃣什么是域名? 2️⃣什么是 DNS? 3️⃣DNS 用 TCP 还是 UDP? 二、DNS 服务器:各司其职的 “导航站” 1️⃣根域名服务器 2️⃣顶级域名服务器 3️⃣权…

iview表单验证一直提示为空的几个原因?

1.Form上的rules是否配置正确; 2.Form-item的prop是否配置正确; 3.规则的名称和input的v-model是否对应; 4.验证的字段是否响应,新增字段使用this. $set. © 著作权归作者所有,转载或内容合作请联系作者 平台声明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和单元测试功能,以及问题解决

一、Mybatis-Plus集成 新增依赖到父级pom.xml,原先的mybatis依赖可以不动需要注意 mybatis-plus与mybatis版本之间的冲突,不要轻易改动依赖,不然分页也容易出现问题分类顶级pom.xml下面,如果没有引入还是出现报错,在co…

删除远程分支上非本分支的提交记录

要删除远程分支上非本分支的提交记录(即主分支的提交历史),需要使用 Git 的重写历史功能。以下是完整解决方案: 解决方案步骤: 创建干净的新分支(基于主分支最新提交) # 切换到主分支并更新 git…

Flask input 和datalist结合

<input list"categories" name"category" id"category" class"form-control" placeholder"任务分类" required> 这段代码是一个 HTML 输入控件&#xff0c;结合了 <input> 和 <datalist>&#xff0c;用来…

嵌入式分享#27:原来GT911有两个I2C地址(全志T527)

最近在调试全志T527的触摸功能时&#xff0c;发现GT911触摸芯片的I2C地址有时是0x5d&#xff0c;有时又识别成0x14&#xff0c;不知道大家有没有遇到过类似这个情况。虽然最后使用0x5d地址调通了触摸功能&#xff0c;但是一直还是很困惑&#xff0c;为什么会出现0x14和0x5d两个…

Linux运维新人自用笔记(Rsync远程传输备份,服务端、邮箱和客户端配置、脚本)

内容全为个人理解和自查资料梳理&#xff0c;欢迎各位大神指点&#xff01;每天学习较为零散。day24一、Rsync传输文件#安装rsync#-a递归同步&#xff08;包含子目录&#xff09;保留文件权限、所有者、组、时间戳等元数据 #​​-z传输时压缩数据 #​​-v显示详细同步过程 #​​…

以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁

当电商行业陷入流量争夺的红海&#xff0c;同质化运营模式难以突破增长瓶颈时&#xff0c;云集以从精选电商到有机生活平台的战略转型&#xff0c;开辟出差异化发展路径。其转型并非凭经验决断的孤例&#xff0c;而是建立在对市场趋势的精准研判、用户需求的深度解码&#xff0…

【2025最新版】midjourney小白零基础入门到精通教程!人工智能绘图+AI绘图+AI画图,一键出图教程 (持续更新)

前言 现在市面上相关的AI绘画工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款强大的人工智能工具&#xff0c;旨在帮助设计师和创意人员完成各种设计任务。 非常适合我们图像工作者&#xff0c;从 UI 设计到…

2025年渗透测试面试题总结-2025年HW(护网面试) 70(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 70 一、自我介绍 二、同源策略 & 三大漏洞对比解析 1. 同源策略&#xff08;SOP&…

加权卡尔曼滤波

加权卡尔曼滤波融合&#xff0c;它通过给不同传感器或估计结果分配不同的权重&#xff0c;来提高状态估计的精度和可靠性。一、卡尔曼滤波1.状态方程2.观测方程其中&#xff1a;基本方程①状态一步预测②状态估计③滤波增益④一步预测均方差⑤估计均方误差二、加权卡尔曼滤波对…

【世纪龙科技】新能源汽车维护与故障诊断-汽车专业数字课程资源

在职业院校汽车专业教学中&#xff0c;理论与实践脱节、设备投入不足、学生实操能力薄弱等问题长期存在。如何让学生在有限的教学资源下掌握新能源汽车核心技术&#xff1f;如何让教师更高效地开展理实一体化教学&#xff1f;《新能源汽车维护与故障诊断》数字课程资源&#xf…

Windows Server系统安装JDK,一直卡在“应用程序正在为首次使用作准备,请稍候”

一、背景 第二次遇到这个问题了&#xff0c;但是居然没想起来之前遇到过&#xff0c;又问元宝给的答案不对&#xff0c;还没想起来之前收藏过解决方案&#xff0c;这里特别记录一下。 二、问题描述 操作系统是Windows Sever2019&#xff0c;安装JDK时卡住一直过不去&#xff0…

机器学习入门:线性回归详解与实战

线性回归&#xff08;Linear Regression&#xff09;是机器学习中最基础也最常用的算法之一&#xff0c;无论是初学者入门还是实际业务场景&#xff0c;都能看到它的身影。本文将从概念、原理到代码实现&#xff0c;带你全方位了解线性回归。一、什么是线性回归&#xff1f;简单…

第3篇:软链接 mklink /D 教程:轻量缓存目录迁移利器

我们通过诸多实践后将三种链接方案分别独立成篇&#xff0c;可以让不同需求场景的读者精准获取所需内容。下面是回顾我们文章系列策划的三篇博客标题、定位和详细大纲&#xff0c;每篇都围绕一个核心方案展开&#xff0c;具备教学性、实用性和实操性&#xff1a; &#x1f4d8;…

力扣 hot100 Day52

124. 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉…

数据存储:OLAP vs OLTP

下面系统性地进行介绍,包括OLAP数据库的基本概念、特点、常见产品,以及它们在实际工作中的典型应用场景,最后对比与关系型数据库(OLTP)的区别。 一、OLAP数据库是什么? OLAP(Online Analytical Processing,联机分析处理)数据库,主要用于大数据量、多维度、复杂查询与…

云原生网络策略自动化在微服务架构 API 安全防护与流量管理中的应用

云原生网络策略自动化在微服务架构中的核心价值随着微服务架构在金融、电商等领域的广泛应用&#xff0c;API安全防护与流量管理已成为企业数字化转型的关键挑战。Gartner 2023年报告显示&#xff0c;83%的分布式系统因网络策略缺失导致安全事件&#xff0c;而传统静态策略配置…

无需云服务器的内网穿透方案 -- cloudflare tunnel

内网穿透 原文地址 https://docs.caolib.dpdns.org/network/cloudflare tunnel.html Cloudflare Tunnel 内网穿透工具 1.简介 1.1 介绍 官方介绍&#xff1a;Cloudflare Tunnel 为您提供了一种安全的方式&#xff0c;无需公开路由的 IP 地址即可将资源连接到 Cloudflare。使用…

目前市面上arm64-v8a、armeabi-v7a设备的市占率有多少?为什么x86架构的手机越来越少?

deepseek回答&#xff1a; 当前全球范围内&#xff0c;arm64-v8a 架构在安卓设备中的市占率已超过 64%&#xff0c;远超其他架构版本。具体分布如下&#xff1a; &#x1f4ca; 各架构市场份额对比 架构类型市占率定位与趋势arm64-v8a≥64%主流 64 位架构&#xff0c;性能最…