【shell 编程大全】shell 变量的定义以及使用

news2024/11/27 10:26:54

shell 变量定义 以及使用

从此刻开始跟我一起学习shell 相关知识吧

前情回顾

上一章节【shell 前奏知识】 我们已经学习了很多shell的必备知识,让我们一起来回顾下。

  • shelll的存放位置
  • 如何切换shell
  • shell文件中的注释有哪些
  • 查看当前系统的shell类型
  • 执行shell的n种方式
  • shell调试的几种方案
  • 以及筛选IP 的经典实例

1. 变量分类

那什么是变量分类呢,变量怎么还会分类呢??? 接下来让我们看下分类到底有哪些

  • 本地变量
  • 全局变量
  • shell内置变量

其实都非常简单。
可以将本地变量 比喻成为 我们在js/Java 中手动定义的变量
可以将全局变量比喻成为 我们在js/ Java中跨作用域的变量
可以将内置变量 比喻成为 哪些不需要我们手动定义,就可以调用的变量,这些变量是语言本身内置的

2. 变量定义

变量定义非常简单,但是有严格的格式要求:变量=值。 在符号【=】的左右两侧不能有空格。

因为空格在shell中是特殊的命令结束符,会被特殊处理。

例如:

[root@localhost my]# age = 20
-bash: age: command not found

在变量age后面有一个空格,会单独将age作为一个命令。所以报错。

正确的代码:

[root@localhost my]# echo $name

[root@localhost my]# name=lihh
[root@localhost my]# echo $name
lihh

3. 类型变量定义

此方式比较鸡肋,作为了解即可

命令语法
	declare 参数 变量名=变量值
参数解析:
    -i 将变量看成整数 
    -r 使变量只读  readonly,==**该变量的值无法改变,并且不能为unset**==
    -x 标记变量为全局变量,类似于export
    -a	指定为索引数组(普通数组);查看普通数组
    -A 指定为关联数组;查看关联数组
注意:
	在生产场景中,这种方法比较鸡肋,使用频率 0-20次/3年

4. 移除变量

通过上述的学习,我们已经学会了在shell中如何定义一个变量。那么变量不可能一直存在,那如果我们想移除怎么办呢

unset 【变量名】

实例

[root@localhost my]# echo $age

[root@localhost my]# age=20
[root@localhost my]# echo $age
20
[root@localhost my]# unset age
[root@localhost my]# echo $age

[root@localhost my]# 

5. 单引号以及双引号区分

基本格式

序号样式要点
方式一变量名=变量值变量值必须是一个整体,中间没有特殊字符
“=” 前后不能有空格
方式二变量名=‘变量值’原字符输出,我看到的内容,我就输出什么内容,
方式三变量名=“变量值”如果变量值范围内,有可以解析的变量A,那么首先解析变量A,
将A的结果和其他内容组合成一个整体,重新赋值给变量B

方式一 演示

[root@localhost my]# name=lihh
[root@localhost my]# echo $name
lihh

方式二 演示

[root@localhost my]# name1='name1-$name'
[root@localhost my]# echo $name1
name1-$name
[root@localhost my]# 

方式三 演示

[root@localhost my]# name2="name2-$name"
[root@localhost my]# echo $name2
name2-lihh
[root@localhost my]# 

6. 命令变量

执行某个命令 将命令的结果赋值给变量

格式

变量=$(命令)

实例

[root@localhost my]# echo $name

[root@localhost my]# name=$(whoami)
[root@localhost my]# echo $name
root
[root@localhost my]# 

7. 全局变量

其实无论我们是运维还是开发,我们都需要知道当前系统中有哪些环境变量。 所以掌握如何查找环境变量还是非常重要的

到底有哪些办法呢

查看全局环境变量
	env			只显示全局变量,一般结合 grep 和管道符来使用
	printenv	效果与env等同
	
	export		查看所有的环境变量,包括声明的过程等信息,一般不用
	declare -x	效果与export类似

真实案例

[root@localhost day02]# env
XDG_SESSION_ID=13
HOSTNAME=localhost.localdomain02
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=root

那我们如何定义全局变量呢

定义全局变量方法一:
	变量=export 变量
定义全局变量方法二:(最常用)
	export 变量=

8. 变量作用范围

在Linux系统下 有两个地方可以加载配置文件

  • 系统级别 /etc/profile /etc/profile.d/env_file_name
  • 用户级别 ~/.bashrc ~/.bash_profile

原则上如果是系统级别的变量,所有的用户都可以看到
但是如果是用户级别的变量的话,用户之间是看不到的

在这里插入图片描述

变量的定义在shell中作用域也是不同的。原则上通过export 定义的变量,作用域会一直向子shell中传递。但是如果是普通的变量,子shell是无法使用的

父shell内容

#!/bin/bash

export pName=lihh
export pAge=18
pSex=1

echo "父shell的字段pName名字是:${pName}"
echo "父shell的字段pAge名字是:${pAge}"
echo "父shell的字段pSex名字是:${pSex}"



# 调用子shell
/bin/bash /var/my/day02/cShell

子shell内容

#!/bin/bash

echo "接受父shell的pName是:${pName}"
echo "接受父shell的pAge是:${pAge}"
echo "接受父shell的pSex是:${pSex}"

执行结果

[root@localhost day02]# /bin/bash ./pShell 
父shell的字段pName名字是:lihh
父shell的字段pAge名字是:18
父shell的字段pSex名字是:1
接受父shell的pName是:lihh
接受父shell的pAge是:18
接受父shell的pSex是:
[root@localhost day02]# 

通过上述结果能看到,父shell中定义的sex,在子shell中并没有打印出来。

9. 内置变量

9.1 脚本相关

脚本相关的变量解析

序号变量名解析
1$0获取当前执行的shell脚本文件名
2$n获取当前执行的shell脚本的第n个参数值,n=1…9,
当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
3$#获取当前shell命令行中参数的总个数
4$?获取执行上一个指令的返回值(0为成功,非0为失败)

9.1.1 $0 获取执行脚本名称

[root@localhost day02]# cat tShell01 
#!/bin/bash

# 获取执行脚本的名称

echo "执行脚本的名称是:$0"
[root@localhost day02]# /bin/bash ./tShell01 
执行脚本的名称是:./tShell01
[root@localhost day02]# /bin/bash /var/my/day02/tShell01 
执行脚本的名称是:/var/my/day02/tShell01
[root@localhost day02]# 

9.1.2 $n 获取脚本的参数

[root@localhost day02]# cat tShell02
#!/bin/bash

# 获取执行脚本的参数

echo "第一个参数是:$1"
echo "第二个参数是:$2"
echo "第三个参数是:$3"
echo "第四个参数是:$4"
[root@localhost day02]# /bin/bash ./tShell02 aa bb cc dd
第一个参数是:aa
第二个参数是:bb
第三个参数是:cc
第四个参数是:dd
[root@localhost day02]# 

9.1.3 $# 获取脚本参数个数

[root@localhost day02]# cat tShell03
#!/bin/bash

# 获取参数个数

echo "参数个数为: $#"
[root@localhost day02]# /bin/bash ./tShell03
参数个数为: 0
[root@localhost day02]# /bin/bash ./tShell03 aa bb cc
参数个数为: 3
[root@localhost day02]# 

9.1.4 $? 返回上一个指令执行结果

[root@localhost day02]# echo name
name
[root@localhost day02]# echo $?
0
[root@localhost day02]# ech
-bash: ech: command not found
[root@localhost day02]# echo $?
127
[root@localhost day02]# 

9.2 字符串相关

字符串相关的语法还是比较简单的。

字符串计数
	${#file}			获取字符串的长度

字符串截取	
	- 语法为${var:pos:length}   表示对变量var从pos开始截取length个字符,pos为空标示0
    ${file:0:5}			从0开始,截取5个字符
    ${file:5:5}			从5开始,截取5个字符
    ${file::5}			从0开始,截取5个字符
    ${file:0-6:3}		从倒数第6个字符开始,截取之后的3个字符
    ${file: -4}			返回字符串最后四个字节,-前面是"空格"

实例

[root@localhost day02]# address=sfsfsdfsdfsdfsfsdfsgsdgsfafsdassdasdadas
[root@localhost day02]# echo ${address}
sfsfsdfsdfsdfsfsdfsgsdgsfafsdassdasdadas
# 计算字符串长度
[root@localhost day02]# echo ${#address}
40
# 从下标0开始 截取长度为5
[root@localhost day02]# echo ${address:0:5}
sfsfs
# 从下标0开始 截取长度为5
[root@localhost day02]# echo ${address::5}
sfsfs
# 从倒数第6位开始 截取长度为5
[root@localhost day02]# echo ${address:0-6:5}
sdada
# 截取倒数二位
[root@localhost day02]# echo ${address: -2}
as
[root@localhost day02]#

9.3 默认值相关

格式解读

格式一:${变量名:-默认值}	
	变量a如果有内容,那么就输出a的变量值
	变量a如果没有内容,那么就输出默认的内容

格式二:${变量名+默认值}	
	无论变量a是否有内容,都输出默认值

实例

[root@localhost day02]# cat tShell04
#!/bin/bash

# 测试默认值

age=99

echo "输出默认值:${name:-lihh}"
echo "必须输出的年龄:${age:+18}"
[root@localhost day02]# /bin/bash ./tShell04
输出默认值:lihh
必须输出的年龄:18
[root@localhost day02]# 

9.4 其他相关

脚本相关的变量解析

序号变量名解析
1$_在此之前执行的命令或脚本的第一个内容
2$@传给脚本的所有参数
3$*是以一个单字符串显示里所有向脚本传递的参数,与位置参数不同,参数可超过9个
4$$是脚本运行的当前进程的ID号,作用是方便以后管理它杀掉他
5$!前一条命令进程的ID号,作用是方便以后管理它杀掉他

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

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

相关文章

ubuntu20.04如何安装nvidia-docker?

文章目录安装步骤导入 NVIDIA GPG 密钥添加 NVIDIA Docker 存储库安装 nvidia-container-toolkit检查nvidia-docker是否安装成功安装步骤 导入 NVIDIA GPG 密钥 curl -s https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -添加 NVIDIA Docker 存储库 dist…

2010-2019年290个地级市经济发展与城市绿化数据

2010-2019年290个地级市经济发展与城市绿化数据 1、时间:2010-2019年 2、来源:城市统计NJ,缺失情况与NJ一致 3、范围:290个地级市 4、指标: 综合经济:地区生产总值、人均地区生产总值、地区生产总值增…

开源的电子邮件客户端Cypht

网友 OOXX 在找好用的 webmail,老苏觉得 Cypht 还不错 什么是 Cypht ? Cypht 是一个简单、轻量级和现代的 Webmail 客户端,它将多个帐户聚合到一个界面中。除了电子邮件帐户,它还支持 Atom/RSS 源。 安装 建数据库 数据库直接用…

MySQL数据库03——数据表的创建、修改和删除

接着上一章的内容,第一章安装好了Mysql和对应的编译器workbench,并且简单的创造了一个数据库college,第二章了解了SQL基础的动词和数据类型。这一章我们学习怎么用这些动词,在这个college库里面创建数据表,并且修改删除…

学习周报-2023-0210

文章目录一 在SUSE11sp3系统中将openssh从6升级到8一 需求二 系统环境三 部署流程1.上传编译安装的软件包2.安装 gcc编译软件3.安装依赖zlib4.安装依赖openssl5.安装openssh二 在CentOS-6.9配置apache服务(3)---虚拟主机配置一 定义二 系统环境三 基于域…

浅解ThreadLocal

我们知道的是synchronized能够解决线程安全中的内存可见性问题(让每个线程读取到的变量一致),而ThreadLocal恰好相反,它是让每个线程都有处理任务过程中不同的值。而我们通过代码发现他确实可以实现这样的功能package executor;/*…

chatgpt注册问题解决. You‘ve made too many phone verification requests.

本来想多注册chagpt几个号,发现注册不了了 错误:You’ve made too many phone verification requests. Please try again later or contact us through our help center at help.openai.com. 或者错误:We’ve detected suspicious behavior…

Java数据结构中二叉树的深度解析及常见OJ题

本篇文章讲述Java数据结构中关于二叉树相关知识及常见的二叉树OJ题做法讲解(包含非递归遍历二叉树) 目录 一、二叉树 1.1二叉树概念 1.2特殊的二叉树 1.3二叉树性质 1.4二叉树基本性质定理题 1.5二叉树遍历基本操作 1.6二叉树遍历的前中后非递归写法 1.7…

聚观早报 | 货拉拉入局跑腿业务;苹果任命首位首席人力资源官

今日要闻:谷歌AI聊天机器人Bard股价大跌7.4%;货拉拉入局跑腿业务;苹果任命首位首席人力资源官;迪士尼宣布裁员 7000 人;家乐福中国 COO 离职 谷歌AI聊天机器人Bard股价大跌 7.4% 2 月 8 日消息,谷歌人工智能…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (四)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

软件使用【SecureCRT】 SSH连接报错Key exchange failed

目录 一、原因分析 二、解决方法 三、修改文件方法 1、修改ssh_config 2、修改sshd_config 3、重新启动服务 SecureCRT连接服务器时报错,报错信息为: Key exchange failed. No compatible key exchange method. The server supports these methods…

轨迹预测算法vectorNet调研报告

前言 传统的行为预测方法是规则的,基于道路结构的约束生成多个行为假设。最近,很多基于学习的预测方法被提出。他们提出了对于不同行为假设的进行概率解释的好处,但是需要重构一个新的表示来编码地图和轨迹信息。有趣的是,虽然高精…

【论文阅读】TDANet:一种具有自上而下注意力的用于语音分离的高效自编码器架构(ICLR 2023)

TDANet: 一种具有自上而下注意力的用于语音分离的高效自编码器架构 文章目录TDANet: 一种具有自上而下注意力的用于语音分离的高效自编码器架构速览摘要方法PipelineTDANet实验总结速览 下载收录源码机构演示arxivICLR 2023PyTorch清华大学Demo inproceedings{tdanet2023iclr,…

Redis应用场景

redis的五种基本数据类型结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;List列表一个链表,链表上的每个节点都包含一个字符串对链表的两…

Docker进阶 - 9. docker network 之自定义网络

1. 运行两个tomcat实例,并进入容器内部 docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8 docker exec -it tomcat81 bashdocker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-idk8 docker exec -it tomcat82 bash2. ping一下各自的ip…

Windeployqt 打包,缺少dll 的解决方法

Windeployqt 打包,缺少DLL 的原因分析,解决方法 很多同学使用工具windeployqt进行打包发布后,运行exe文件时,还是会出现下图所示的系统错误提示,这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显…

20230210使AIO-3568J开发板在Android12下调通3个USB

20230210使AIO-3568J开发板在Android12下调通3个USB 2023/2/10 10:00 0、默认编译RK3568的Andorid12的rk3568-evb2-lp4x-v10.dts,2个USB2.0接口的鼠标可以用。 并列USB3.0接口的上面的鼠标不能用。USB3.0接口下面可以连接ADB。 vcc5v0_host: vcc5v0-host-regula…

邀您参赛!DCIC 2023「科技金融欺诈风险识别」算法赛正在报名中

近年来,跨境赌博、电信网络诈骗、黑产等外部欺诈违法犯罪形势日益严峻,呈现线上化、产业化、团伙化等特征,国家、监管机构及银行自身都高度重视反欺诈治理工作,坚决守护人民群众的财产安全。 为进一步打击外部欺诈违法犯罪行为&am…

CentOS7 ifconfig(或 ip addr)命令不显示IP地址

问题(因为当时没有存图 所以这个图上是网上找的 )解决办法第一:可能是本地服务没有开启,检查本地服务。如图所示,检查这两个服务是否开启。注:如何快速找到服务 可以把光标放在其中一个上面 然后按下VM就可…

硬盘分类及挂载硬盘知识补充和介绍

一、硬盘介绍Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘1.对于IDE硬盘,驱动器标识符为"hdx~",其中"hd"表明分区所在设备的类型,这里是指IDE硬盘了。"x"为盘号(a为基本盘,b为基…