Shell学习——shell中的变量

news2024/10/22 17:38:33

目录

一、父shell和子shell:

二、系统预定变量

定义方式:

脚本举例

​编辑

四、只读变量

五、撤销变量

六、小结

七、特殊变量

$n

$#

$*、$@

$?


一、父shell和子shell:

        由于shell的原理可以理解为套娃,因此有父shell和子shell的概念

[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       1876   1872  0 09:06 pts/0    00:00:00 -bash
root       1896   1876  0 09:06 pts/0    00:00:00 ps -f


[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       1876   1872  0 09:06 pts/0    00:00:00 -bash
root       1897   1876  0 09:07 pts/0    00:00:00 bash
root       1908   1897  0 09:07 pts/0    00:00:00 ps -f


[root@hadoop-master sh_test]# exit
exit
[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       1876   1872  0 09:06 pts/0    00:00:00 -bash
root       1974   1876  0 09:39 pts/0    00:00:00 ps -f

         可以看到,原本有一个登录进来启动的bash shell,我们再敲一个bash,会出现一个子进程,接下来执行脚本,将在子shell里面执行,可以使用exit退出。

        开启父子shell需要特别注意环境变量的继承关系,变量即内存当中存储的数据,由于shell是套壳的,因此系统变量对父shell及子shell都可以产生作用,但在子shell中设置的当前变量,父shell不可见。

二、系统预定变量

        环境变量即使用变量存储当前shell会话和工作环境的相关信息,

        $HOME、$PWD、$SHELL、$USER

[root@hadoop-master sh_test]# echo $USER
root
[root@hadoop-master sh_test]# printenv HOME
/root

#用set可以看到所有的变量
[root@hadoop-master sh_test]# set | less

三、用户自定义变量

定义方式:

        =号两边不能有空格,有的话要用引号引起来

[root@hadoop-master sh_test]# a="my var"
[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       2067   2063  0 11:04 pts/0    00:00:00 -bash
root       2158   2067  0 11:18 pts/0    00:00:00 ps -f
[root@hadoop-master sh_test]# echo $a
my var

         进入子shell变量,局部变量就失效了:

[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# echo $a
[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       2067   2063  0 11:04 pts/0    00:00:00 -bash
root       2170   2067  0 11:19 pts/0    00:00:00 bash
root       2181   2170  0 11:19 pts/0    00:00:00 ps -f

[root@hadoop-master sh_test]# exit
exit

        使用export可以将局部变量升级为全局变量

[root@hadoop-master sh_test]# export a
[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# echo $a
my var

        但是,在子shell里面的变量修改不会改变外层父shell的值,如

[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       2067   2063  0 11:04 pts/0    00:00:00 -bash
root       2170   2067  0 11:19 pts/0    00:00:00 bash
root       2183   2170  0 11:24 pts/0    00:00:00 ps -f
[root@hadoop-master sh_test]# a="your var"
[root@hadoop-master sh_test]# echo $a
your var
[root@hadoop-master sh_test]# exit
exit
[root@hadoop-master sh_test]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root       2067   2063  0 11:04 pts/0    00:00:00 -bash
root       2184   2067  0 11:24 pts/0    00:00:00 ps -f
[root@hadoop-master sh_test]# echo $a
my var

脚本举例

        其中:

        写个打印脚本执行:

[root@hadoop-master sh_test]# ./hello.sh
Hi,dear~

[root@hadoop-master sh_test]# source hello.sh
Hi,dear~
hi,my var

        由于直接用相对/绝对路径会新开启一个子shell,作为局部变量的my_var是打印不出来的,而source在当前bash环境直接执行

        使用export将my_var升级为全局变量后,子shell也可以使用了:

[root@hadoop-master sh_test]# export my_var
[root@hadoop-master sh_test]# ./hello.sh
Hi,dear~
hi,my var

四、只读变量

        只能读取不能修改

[root@hadoop-master sh_test]# readonly b=5
[root@hadoop-master sh_test]# b=10
-bash: b: 只读变量

五、撤销变量

        使用unset,只读变量不能撤销

[root@hadoop-master sh_test]# unset b
-bash: unset: b: 无法反设定: 只读 variable

六、小结

  • 变量名称可由数字、变量、下划线组成,但不能以数字开头,环境变量名建议大写。
  • 等号两变不能空格
  • bash中,变量默认字符串类型,无法直接进行数值计算。
  • 变量值若有空格需要用引号引起来
  • export、unset、readonly的作用

七、特殊变量

        对脚本的输入参数进行捕获和处理

$n

n为数字:

  • 0:脚本名称
  • 1-9:第1-9个参数
  • 10或以上:参数需要用{}括起来如${10}

[root@hadoop-master sh_test]# hello.sh xiaoliang
Hi,dear~
hi,xiaoliang

        区别单双引号

[root@hadoop-master sh_test]# ./hello.sh
This is ./hello.sh
Hi,dear~
hi,
==========
=====$n=====

$#

        获取输入参数的个数,对于测试脚本:

[root@hadoop-master sh_test]# ./hello.sh 
This is ./hello.sh
hi,
hi,
=====0个输入参数=====

        添加输入参数:

[root@hadoop-master sh_test]# ./hello.sh windows
This is ./hello.sh
hi,windows
hi,
=====1个输入参数=====

[root@hadoop-master sh_test]# ./hello.sh windows linux
This is ./hello.sh
hi,windows
hi,linux
=====2个输入参数=====

$*、$@

        均代表命令行中所有参数:

[root@hadoop-master sh_test]# ./hello.sh windows linux
This is ./hello.sh
hi,windows
hi,linux
=====$*=====
windows linux
=====$@=====
windows linux

        区别:$*将所有参数当做一个整体,而$@将参数当做一个数组,可以在循环中进行遍历

$?

        最后一次执行命令的返回状态,若为0,证明上一次命令正确执行,若非0,证明上一个命令执行不正确(具体哪个数由命令自己决定)

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

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

相关文章

【实战案例】Django框架连接并操作数据库MySQL相关API

本文相关操作基于上次操作基本请求及响应基础之上【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 Django框架中默认会连接SQLite数据库,好处是方便无需远程连接,打包项目挪到其他环境安装一下依赖一会就跑起来,但是缺点…

你知道吗?这个岗位只招2人,但HR那边却收到了1w份简历

引言 在当前经济环境下,求职者面临的挑战越来越大。互联网行业尤其如此,许多人挤破头都想进入大厂,但竞争异常激烈。如今的就业市场确实变得异常艰难。然而,随着AI大模型技术的兴起,对于那些掌握了相关技能的专业人才…

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID,BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID),BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节):由16位(2字节)的桥优先级…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

wordcloud分词生成

代码如下 _ from wordcloud import WordCloud import PIL.Image as image import numpy as np import jiebadef cut(text):word_list jieba.cut(text,cut_all True)# 分词后在单独个体之间加上空格result " ".join(word_list)return result#导入文本文件,进行分词…

免费ppt模板从哪找?全面又实用的PPT模板就在这找

就是说有多少刚上大学的朋友,为了交一份完美的PPT报告,手写列大纲、找报告文献/插图素材......最后手动整理排版,老老实实地熬了几个大夜? 24年都快结束啦,大家还没学会去免费的ppt模板网站下载精美的主题PPT一键替换吗…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发(二) 使用vscode进行远程开发很简单,在拓展里搜索 Remote Development,就可以搜索到微软提供的远程开发大礼包,里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL(Win…

亚马逊测评自养号技术及采购下单成功率揭秘

在亚马逊测评中,自养号面临砍单、买家号关联等问题时,需要采取一系列策略和技术手段来提高采购下单的成功率。以下是一些具体的解决方案: 一、解决砍单问题 1.确保硬件参数独立 每个账号应使用具有独特硬件标识的设备,如IMEI、…

【大模型实战篇】大模型分词算法WordPiece分词及代码示例

继《大模型数据词元化处理BPE(Byte-Pair Encoding tokenization)》之后,我们针对大模型原始数据的分词处理,继续分享WordPiece分词技术【1】。 1. 原理分析 WordPiece 是 Google 开发的分词算法,用于预训练 BERT。此后,它被多个基…

uni-app中添加自定义相机(微信小程序+app)

一、微信小程序中 微信小程序中可以直接使用camera标签&#xff0c;这个标签不兼容app&#xff0c;官方文档 <cameradevice-position"back"flash"off":style"{ height: lheight px, width: lwidth px }"class"w-full"></c…

vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)

1. 安装相关插件 npm i unplugin-vue-markdown markdown-it-prism prism unhead/vue2. 添加配置 src/main.ts // 给 md 文件创建头部 import { createHead } from unhead/vue // md 文件中代码高亮的样式 import prismjs/themes/prism.css // 自定义 md 文件的样式 import /as…

【JAVA面试题】什么是Springboot的自动配置以及注意事项

文章目录 强烈推荐核心概念&#xff1a;自动配置的关键特点&#xff1a;示例&#xff1a; 需要注意的点1.默认配置可能不适合所有场景2.Bean 冲突与覆盖3.应用启动慢的问题4.过度依赖自动配置5.安全性问题6.依赖冲突与版本兼容7.过多不必要的自动配置8.调试困难 专栏集锦 强烈推…

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题&#xff0c;可以尝试以下几种方法&#xff1a; 1.使用 DISM 工具&#xff1a; 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符&#xff0c;输入以下命令&#xff1a; dism /online /En…

【web前端设计】jquery图标动画特效

学习目标 学习web前端设计技术&#xff08;HTML、css、JavaScript、jQuery等&#xff09;&#xff0c;综合运用技术&#xff0c;将其与HTML元素结合&#xff0c;设计样式、监听事件、添加动画等&#xff0c;给用户呈现出更好的视觉交互效果。本文主要学习分页按钮自动放大、元…

HCIP-HarmonyOS Application Developer 习题(十二)

&#xff08;多选&#xff09;1、声明式开发范式的转场动画包含以下哪几种类型? A、页面间转场 B、应用间转场 C、共享元素转场 D、组件内转场 答案&#xff1a;ACD 分析&#xff1a; &#xff08;多选&#xff09;2、公共事件服务为应用程序提供哪些能力。 A、取消发布公共…

IPMA能力基础线是什么?项目管理工具有哪些应用场景?

作为资深团队管理者&#xff0c;常常面临如何提升团队项目管理能力的挑战。其实在现代的项目管理世界中&#xff0c;有许多标准和模型帮助我们更好地理解项目的复杂性&#xff0c;IPMA&#xff08;International Project Management Association&#xff09;能力基础线就是其中…

iOS静态库(.a)及资源文件的生成与使用详解(Swift版本)

引言 在 iOS 开发中&#xff0c;开发者常常需要将一些功能模块封装成可重用的库&#xff0c;以便在多个项目中共享使用。除了常见的Framework&#xff08;动态库/静态库&#xff09;&#xff0c;静态库&#xff08;.a文件&#xff09;也是一种非常实用的封装方式。静态库在编译…

Java全栈经典面试题剖析4】JavaSE高级 -- 包装类,String, 类方法

目录 面试题3.1 什么是自动装箱与拆箱&#xff1f;用什么方式来装箱与拆箱&#xff1f; 面试题3.2 int和Integer有什么区别&#xff1f; 面试题3.3 Integer常量池 面试题3.4 字符串常量池 面试题3.5 这句代码创建了几个对象? String str1 new String("xyz");…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…