shell脚本中的变量

news2025/1/14 22:34:18

关于Linux操作系统中当前shell进程与子shell进程的详细解释

如上图所示,使用ps -f可以当前查看Linux操作系统中当前正在运行的进程。

然后敲bash后,相当于在当前的bash shell环境下又创建了一个子bash shell的进程,

如上图所示,后来创建的bash shell的PPID是前一个bash shell的PID

使用./hello.sh的方式去调用脚本就相当于是在原来bash shell的基础上又开了一个子bash shell,然后在子bash shell中去调用脚本。 

敲exit命令时会发现没有退出Linux操作系统就在于当前是在子shell进程中,

开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell中是不可见的。

系统预定义变量

在shell编程中存在系统变量和用户变量,其中系统变量的作用范围是全局,而用户变量的作用范围却是分为全局变量和局部变量。

局部变量是只对当前的bash起效。

Linux操作系统中shell编程的系统变量大部分是全局变量,小部分是局部变量。

$HOME表示当前用户的家目录,$PWD表示当前用户的工作目录,$SHELL表示当前的shell会话,$USER表示当前的用户,

如果想查看当前所有的全局环境变量的话,就是用env,printenv的功能和普通的env大致是一样的。

如果想使用系统变量,就使用echo或者printenv加系统变量。

如上图所示,如果只是想查看当前系统变量的值的话,加不加$符无所谓但是如果想使用系统变量的值的话,就必须加上$了。

在Linux操作系统中可以使用set命令可以用来显示当前所有的shell变量(包括环境变量)及其值。

用户的自定义变量

如上图所示,在Linux操作系统中shell编程语言中关于用户变量的定义只需要变量名=变量值,就可以直接定义变量,不需要像其他编程语言一样去定义变量的类型再去给变量赋值,如果变量值中有空格就需要我们将将变量值用引号引起来才能生效,这时定义的变量属于用户变量中的局部变量,即在原来的bash环境中有,在子bash中没有,

可以使用set | grep my_var这样的命令来查找用户创建的变量的值,

如上图所示,在新创建的子bash中,echo $my_var发现不输出变量的值,这就说明用户创建的my_var是一个局部变量。

如上图所示,在子bash中找不到用户创建的变量的值,但是退出子bash后,可以查找到用户创建的变量的值,说明这时一个用户变量中的局部变量,如果像把局部变量定义成全局变量的话,如下图操作。

如上图所示,如果我们想定义一个全局变量它的作用范围是在-bash以及嵌套的bash中有效,

这就需要使用export 变量名称,来将用户创建的局部变量定义为一个全局变量,这时再创建一个bash环境,进入到这个子bash环境时,echo 变量名称,发现变量的值就可以输出打印了。

如果在子bash中对这个变量进行变量值的修改时,再进入到别的bash环境中,就发现原来变量的值并没有改变,

所以对这个全局变量的修改只在修改界面中的bash中有效,在其他的bash环境中对变量的修改操作无效。当然如果在子bash中对变量进行更改后,使用export 变量名称,这时子bash包括它嵌套的子bash中修改的变量值都是可以看到的。

如上图所示,在子bash中对全局变量进行数值修改以后,再将变量重新定义为全局变量时,切换到-bash环境中依然看不到对变量的修改操作,所以在子bash中对变量进行更改后,使用export 变量名称,这时子bash包括它嵌套的子bash中修改的变量值都是可以看到的。但是在子bash以外的bash环境中看不到对变量的修改操作。

在不同bash环境中对脚本的调用

如上图所示,在脚本hello.sh中加上了一个变量,当调用这个脚本的时候,就可以打印输出这个变量的值,而随着调用脚本的bash环境不同,其调用脚本的结果也不同,当使用source 调用脚本的时候,bash环境是当前的bash环境,而使用./hello.sh来调用脚本的时候,bash环境就是当前bash环境的子bash环境,

这时定义一个用户变量中的局部变量,然后在脚本hello.sh中添加这个变量,发现在当前bash环境中的子bash环境中这个局部变量是不生效的。而如果以. hello.sh或者source hello.sh来在当前bash环境中调用这个脚本局部变量就可以生效。

如果使用export 局部变量名称,这时该局部变量就变成了全局变量,这时再使用./hello.sh(在当前bash环境下启动一个子bash,或者给脚本添加x执行权限,直接通过调用脚本路径的方式来调用脚本)这样的方式来调用脚本,该脚本中的两个变量都生效。

全局变量,只读变量和撤销变量

如上图所示,使用echo 加变量名称,就可以打印变量值,对于shell编程来说,变量名=变量值,这期间没有能对变量值进行运算的操作,如果想对变量值进行运算就需要使用a=$[5+9]或者是a=$((1+5))这样的操作。

这里是关于shell编程的运算符的介绍,

只读变量

这里的意思就是说定义一个常量,此时这个变量中的变量值只能进行读的操作,不能对这个变量值进行修改。

如上图所示,这是在定义一个只读变量,使用readonly 变量名称=变量值,这就是在shell中定义了一个只读变量,如果此时想修改这个变量的变量值,就会被提醒,这是一个只读变量,不能进行对变量值的修改操作。

撤销变量

如上图所示,如果你想撤销一个变量的话,直接unset 变量名,就可以将该变量撤销掉,撤销变量的意义在于该变量没有用处时,撤销掉,节省内存空间。

在shell编程中如果将一个变量定义为一个只读变量,此时直接用unset 变量名称,是不可以撤销这个只读变量的,需要先将这个只读变量的只读状态撤销掉。

如果你确实需要“撤销”这个只读状态,可以采取以下策略之一:

  1. 重新声明变量:你可以在新的Shell作用域中重新声明这个变量,这样就绕过了原来的只读限制。这通常意味着在子shell中或者一个新的脚本进程中来做这件事,因为父shell中的只读属性不会传递给子进程。

     Bash 
    1# 在子shell中重置变量
    2(
    3  myVar="New Value"
    4  echo "$myVar"  # 输出 "New Value"
    5)
    6echo "$myVar"  # 回到父shell,输出仍是 "Hello World"
  2. 使用unset后再重新赋值:注意,unset命令可以删除一个变量,包括只读变量,但这仅在该变量不是全局只读变量时有效。之后,你可以重新声明该变量。但请注意,这实际上是“删除并重新创建”,而非直接撤销只读属性。

     Bash 
    1# 如果变量不是全局只读,可以先unset再赋值
    2unset myVar
    3myVar="New Value"
  3. 避免使用readonly:在设计脚本时,如果预见需要改变变量的值,最初就不要将其声明为只读。

由于Shell中没有直接撤销只读属性的命令,理解和规划你的脚本结构以适应这种限制是很重要的。在大多数情况下,只读变量是用来防止意外修改关键数据的,因此撤销只读状态应当谨慎考虑其必要性。

如何将脚本当作命令一样去使用呢?(前提在不改变/bin/目录内容的前提下.)

如上图所示,可以将脚本的名称cp 复制到/bin/下,此时对于脚本的调用就可以像正常的命令一样,但是/bin/是Linux操作系统储存命令shell脚本的地方,特别不建议对/bin/中的内容进行修改。

如上图所示,可以将脚本的名称复制到/root/bin目录中,这样就可以将该脚本的调用当成像命令一样了,或者直接将脚本的绝对目录加入到/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin中,这样对脚本的调用也可以像命令的调用一样了。

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
 

对于脚本来说,如何给脚本加参数?

对于脚本来说,这个脚本的作用对象不同,给传递给脚本的参数也不相同。

在Linux操作系统中对参数的获取。这里的$数字参数,主要是位置参数。

如上图所示,当你想在调用脚本的时候,给脚本传递相应的参数的话,就需要在脚本中编写的时候,加入相应的变量来储存参数,比如$1这样的变量。

如上图所示,在编写脚本后记得给脚本添加上可执行权限,

script name:可以直接输出此时调用脚本的路径,

1st paramater :$1 这里的$1用来承接变量1

2nd paramater:$2这里的$2用来承接变量2

在Linux操作系统中对参数的获取,这里的$n参数,主要作用是统计系统传给脚本的参数的个数。

如上图所示,parameter numbers:2 表示当前系统传给脚本的参数个数是两个。

在Linux操作系统中对参数的获取,这里的$*和$@参数,$*的主要作用是代表命令行中所有的参数,$*把所有的参数看成是一个整体,$@把每个参数区分对待。

$*获取到的像是一个整体比如abc def

$@获取到的像是一个数组,比如[abc,def]  这里的$@获取到的结果像是一个数组,此时就可以使用循环去遍历里面的参数,

在Linux操作系统中对参数的获取,$?的作用是返回最后一次执行脚本的

$?这个特殊变量用来储存执行命令之后的返回值,如果返回值是0则表示上一条命令执行成功。

如上图所示,当一个命令执行成功的时候,此时敲命令 echo $?系统返回数字0表示命令执行成功,

当一个命令执行失败的时候,此时敲命令echo $?系统返回数字127表示命令执行失败。

注意在shell编程中使用单引号包围字符串和使用双引号包围字符串的时候有什么区别?

在Shell编程中,当你使用单引号(')包围字符串时,Shell会原样输出字符串内的内容,不做任何变量替换或特殊字符处理。所以,如果你写了 echo '======$n======',Shell会将$n视为字符串中的文字字符,而不是一个变量引用。它会原封不动地输出 ======$n=====, 而不会尝试去替换$n为它可能代表的变量值。

如果你想让Shell解析 $n 作为变量,并显示其值(假设之前已定义),你应该使用双引号("):

 

Bash

1echo "======$n======"

在双引号中,Shell会执行变量扩展、命令替换等操作,因此如果之前有定义变量 n,它的值就会被正确地插入到字符串中输出。

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

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

相关文章

Apache Druid-时序数据库

Apache Druid:是是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台,旨在对大型数据集进行快速的查询分析("OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景&…

手把手带你实现一个简单的轮播图

轮播图现有成熟的插件非常多,但做为一名学习中的想要成为前端开发的小伙伴们来说,自己动手实现一个轮播图,还是很锻炼的,实现完成后,也是很有成就感的。下面,我们来实现一个简单的轮播图吧。 目录 1 HTML …

DIY一个PE启动盘

原文:https://blog.c12th.cn/archives/18.html 前言 有天,朋友问我有没有带集成软件的U盘启动盘。我也是很久没有弄启动盘了,有次在逛b站时无意中看到还有可以DIY的启动盘,于是就教程就来了… 该两种方法,已在三台实体…

SCADA软件地毯式介绍,你想知道的都在这里.

很多小伙伴对SCADA很陌生,殊不知这个可是智慧工业制造的大脑和中枢神经,很多指令的发出,监控状态的现实都得通过这个系统,本文详解介绍一下什么是SCADA,重大作用,其在工业制造中的位置,以及市面…

停车场控制机系统哪家好?捷顺捷曜分体式车场控制机有哪些功能亮点?

停车场控制机为现代城市提供了许多便利和好处。首先,它能够自动记录车辆进出的时间,便于车主和管理人员进行费用计算。其次,通过车牌识别技术,提高了车辆进出的效率,减少了排队等待时间。此外,控制机还可以…

【Pepper机器人开发与应用】二、Pepper机器人图形化开发:医疗服务机器人程序设计

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 📑上期文章:『【Pepper机器人开发与应用】一、教你如何使用图形化开发软件高效开发pepper机器人(Pepper SDK for LabVIEW&#xff09…

MFC开发 解决:VSstudio2019 无法打开afxwin.h 或 安装afxwin.h

在进行MFC开发的学习中,在win10系统下使用vs studio2019进行mfc开发,出现的标题的问题 首先,如果你以及安装过了afxwin.h相关环境 那么按照如下步骤 首先 打开工程的属性 在 高级——MFC的使用——选择在共享DLL中使用MFC 如下 …

JVM 基本组成

一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…

【AICFD教程】汽车外气动仿真,小白学CFD的入门案例

【视频教程】 【教程】汽车外气动仿真,小白学CFD的入门案例 【文字教程】 1. 案例背景 1.1 学习目标 本案例针对某汽车仿真模型,在车速为40m/s时进行了汽车外流场的数值模拟。 本案例教程旨在演示AICFD中以下场景与功能的操作: a. 单域外…

JavaScript和promise——0_1 promise

文章目录 是什么?未来值回调和未来值在回调环境下这么和未来值交互?群居的未来值其他的解决方案 这样写可以实现目标效果。可是,这样写优雅吗? 英雄登场关键词:then关键词:回调 为什么promise不需要start函…

在等保2.0框架下,如何进行有效的物联网设备安全培训和意识提升?

在等保2.0框架下,进行有效的物联网设备安全培训和意识提升,可以从以下几个方面入手: 1. 分层次培训内容设计: • 基础知识普及:涵盖物联网的定义、特点及其面临的安全威胁和攻击手段,让员工理解物联网安全…

技巧|手机上看SwanLab实验的两种方法

什么是SwanLab? SwanLab是一个深度学习实验管理与训练可视化工具,由西安电子科技大学创业团队打造,融合了Weights & Biases与Tensorboard的特点,可以记录整个实验的超参数、指标、训练环境、Python版本等,并可视化图表&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] A先生的货运计划(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 A先生的货运计划(200分) 🌍 评测功能需要 订阅专栏 后私信…

科普童话投稿

《科普童话》杂志是由国家新闻出版总署批准、黑龙江省教育厅主管、黑龙江省语言文字报刊社主办的正规期刊。《科普童话》以培养科学素养与创新探索精神为办刊宗旨,以科学与艺术统一为编辑方针,以科学教育、教育科学作为自己的出发点,致力于对…

揭秘网络盗版游戏产业链,守护游戏安全 | 天堂1私服非法牟利,涉嫌洗黑钱!

近年来,网络盗版游戏现象日益猖獗,尤其是天堂1私服。这些盗版游戏不仅非法牟利,还存在偷税漏税、诱导消费等违法行为。本文将揭示这一产业链的真相,提醒广大游戏玩家保持警惕,并向相关部门举报,共同维护互联…

安卓软件自动运行插件的开发源代码介绍!

随着移动互联网的快速发展,安卓操作系统凭借其开放性和灵活性,成为了众多开发者们的首选平台,在安卓应用的开发中,为了实现各种复杂的功能,插件化技术逐渐受到青睐。 其中,自动运行插件作为一种能够实现应…

MT8766安卓4G核心板_MTK联发科PCBA方案开发

MT8766是联发科四核4G模块方案,安卓一体板。 采用台积电 12 nm FinFET 制程工艺,4*A53架构,Android 9.0操作系统,搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力,专为具有…

可提供实习证明/实习鉴定报告,企业项目试岗实训开营啦

在数字化转型的浪潮中,大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前,全球各行各业都在积极推进数字化转型,不仅为经济增长注入新活力,也对人才市场结构产生了深刻影响,尤其是对数字化人才…

CCS环形低角度光源用于细微凹凸、损伤、刻印字符的成像——LDR2-LA1系列

机器视觉系统中,光源起着重要作用,不同类型的光源应用也不同,选择合适的光源成像效果非常明显。今天我们一起来看看CCS光源——工业用环形低角度光源LDR2-LA1系列,可对被测物体近距离使用。 LDR2-LA1 特点 1、从被测物体的最近距…

数据可视化实验四:Pyecharts数据可视化

目录 一、使用PyEcharts绘制全国肺炎确诊人数分布图 1.1 柱状图 1.1.2 代码实现 1.1.2 绘制结果 1.2 饼状图 1.2.1 代码实现 1.2.2 绘制结果 1.3 使用over lap实现图形叠加 1.3.1 代码实现 1.3.2 绘制结果 1.4 地图绘制-Map 1.4.1 代码实现 1.4.2 绘制结果 1.5 地…