【Shell 脚本速成】02、Shell 变量详解

news2024/11/26 17:16:04

目录

一、变量介绍

变量存取原理

二、变量定义

2.1 什么时候需要定义变量?

2.2 定义一个变量

定义变量举例:

定义变量演示: 

2.3 取消变量 unset

2.4 有类型变量 declare 

declare 命令参数:

案例演示:

三、变量分类

3.1 本地变量

3.2 环境变量

3.3 将当前变量变成环境变量 export

3.4 父 shell 与子 shell

总结:

案例演示:

3.5 全局变量

3.6 内置变量

案例演示:

3.7 变量总结说明:

四、变量取值

五、其他变量(扩展)

案例演示:


 

一、变量介绍

        在编程中,我们总有一些数据需要临时存放在内存,以待后续使用时快速读出。先了解一下计算机的存储单位吧。

计算机的单位:
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
...
好了,已经够大了!当然还有YB、BB更大的单位,同样进制也是1024.

1G=1024*1024*1024=1073741824B

        假如你将一个1B的字符存入内存,如何读出呢?有没有一种大海捞针的感觉啊!我们讨论一下计算机是如何通过让我们人类快速将数据存在内存,如何从内存中读出数据的。我们研究过变量后就明白了。

变量:变量是编程中最常用的一种临时在内存中存取数据的一种方式。

变量存取原理

关于内存的说明
a、系统启动:内存被按照1B一个单位划分成N块,并且以十六进制为每一个空间编号

b、内存跟踪表记录:使用和未使用的内存的地址编号

c、内存申请:系统从未使用的内存中拿出一个或者一段连续空间给你使用,同时在内存跟踪表中记录;该地址被占用不在分给别人,同时在系统中建立映射机制   

比如:变量名 STRING1=‘ABC’

name<==>0x5

d、释放内存
从内存跟踪表中将记录删除,下次存数据直接覆盖

CHAR1(0x3)=A
从图片可以看出,当我们在脚本中定义变量存值的时候,可以从以下方面看到变化:
a、内存占用:如果存的是一个字符则占用1个字节,如果存的是字符串则是字符串的长度加1个字节长度(\0是一个特殊字符,代表字符串结束)。

b、变量名与内存空间关系:计算机中会将对应的内存空间地址和变量名称绑定在一起,此时代表这段内存空间已经被程序占用,其他程序不可复用;然后将变量名对应的值存在对应内存地址的空间里。

二、变量定义

2.1 什么时候需要定义变量?

  1. 如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。这样在修改内容的时候,仅仅需要修改变量的值。
  2. 在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。

2.2 定义一个变量

变量格式: 变量名=值

在shell编程中的变量名和等号之间不能有空格。

变量名命名规则:
    命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    中间不能有空格,可以使用下划线 "_"。
    不能使用标点符号。
    不能使用bash里的关键字(可用help命令查看保留关键字)。

定义变量举例:

  • VAR1=1
  • age=18              整数(形)
  • name=‘baism’    字符串
  • score=88.8         浮点

注意:字符串要用单引号或双引号引起来;建议变量名为大写,和命令区分,如 LS 或 _ls 

定义变量演示: 

# 变量赋值,此种方法设置为本地变量(临时生效,重启失效)
[root@sql-master ~]# _name='sky'
[root@sql-master ~]# age=18
[root@sql-master ~]# echo $_name
sky

2.3 取消变量 unset

# 取消当前环境中的变量,如果是变量设置是保存在文件中,下次重启又会恢复
[root@sql-master ~]# unset _name
[root@sql-master ~]# echo $_name

2.4 有类型变量 declare 

declare 命令参数:

  • -i 将变量看成整数
  • -r 使变量只读 readonly,该变量的值无法改变,并且不能使用unset
  • -x 标记变量通过环境导出 export(全局变量)
  • -a 指定为索引数组(普通数组);查看普通数组
  • -A 指定为关联数组;查看关联数组

案例演示:

1.定义变量为整数

[root@sql-master ~]# echo $_name
0
[root@sql-master ~]# _name=100.99
-bash: 100.99: 语法错误: 无效的算术运算符 (错误符号是 ".99")
[root@sql-master ~]# _name=100
[root@sql-master ~]# echo $_name
100

2.定义变量为只读模式

[root@sql-master ~]# declare -r test='sky01'
[root@sql-master ~]# echo $test
sky01
[root@sql-master ~]# test=123
-bash: test: 只读变量
[root@sql-master ~]# unset test
-bash: unset: test: 无法反设定: 只读 variable

 

三、变量分类

系统中的变量根据作用域及生命周期可以分为四类:本地变量、环境变量、全局变量、内置变量

3.1 本地变量

用户自定义的变量,定义在脚本或者当前终端(会话)中,脚本执行完毕或终端(会话)结束变量失效。

3.2 环境变量

定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。

  • 查看当前用户的环境变量        env
  • 查看当前用户的所有变量(临时变量与环境变量)         set

3.3 将当前变量变成环境变量 export

# 定义一个临时变量,临时将一个本地变量(临时变量)变成环境变量(全局变量)
[root@sql-master ~]# export A=hello
[root@sql-master ~]# env | grep ^A

# 定义一个永久生效变量:
vim .bash_profile 或者 ~/.bashrc
A=hello

3.4 父 shell 与子 shell

export 说明

  • 用户登录时:

        用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以 创建并运行 shell脚本程序。

  • 运行脚本时:

        运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell, 另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本 之前的shell。

        从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。 在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时, 这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中 被改变,可以使用export命令对已定义的变量进行输出。

        export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。 

总结:

        当前父shell中定义变量中,分为本地变量和环境变量,不同点是局部变量只能作用于本父shell,子shell无法继续使用,如果使用了export将局部变量定义为全局变量,那么父shell在创建子shell的时候会将该变量一同复制给子shell的环境。

案例演示:

[root@sql-master ~]# age=20
[root@sql-master ~]# export neme='sky'
[root@sql-master ~]# vim test_02.sh
#!/bin/bash

echo $age
echo $neme
[root@sql-master ~]# bash test_02.sh 

sky

3.5 全局变量

  • 使用export命令将本地变量输出为当前shell中的环境变量(临时有效)
  • 所有用户及shell都可以使用,可以在 /etc/profile 下永久定义
# 打印全局变量 printenv
[root@sql-master ~]# printenv

# 定义永久变量
[root@sql-master ~]# vim /etc/profile
name='root'
export name
[root@sql-master ~]# source /etc/profile

# 测试方法:通过不同用户登录测试是否能读取变量
[root@sql-master ~]# echo $name
root
[root@sql-master ~]# su - tuschool
[root@sql-master ~]# echo $name
root

3.6 内置变量

系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用

$?:输出上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
    若退出状态值为0,表示命令运行成功
    若退出状态值为127,表示command not found
    若退出状态值为126,表示找到了该命令但无法执行(权限不够)
    若退出状态值为1&2,表示没有那个文件或目录
  
$$:当前所在进程的进程号     echo $$   eg:kill -9 `echo $$`  = exit   退出当前会话

$!:后台运行的最后一个进程号  (当前终端)  # gedit &
!$:调用最后一条命令历史中的参数
!!:调用最后一条命令历史


$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出

$0:当前执行的进程/程序名  echo $0     
$1~$9:位置参数变量
${10}~${n}:扩展位置参数变量  第10个位置变量必须用{}大括号括起来

案例演示:

[root@sql-master ~]# vim 1.sh
#!/bin/bash

echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1" 
echo "\$2 = $2" 
echo "\$3 = $3" 
echo "\$11 = ${11}" 
echo "\$12 = ${12}"

[root@sql-master ~]# sh 1.sh a b c d e f g h i j k l m n

 

3.7 变量总结说明:

  • 本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
  • 环境变量:当前进程有效,并且能够被子进程调用。
  • 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。
  • 内置变量:shell本身已经固定好了它的名字和作用。
变量类型作用域生命周期
本地变量当前shell环境(子shell不能用)脚本结束或终端结束
环境变量当前shell或者子shell当前进程结束
全局变量所有用户及shell环境关机
内置变量所有用户及shell环境关机

四、变量取值

读取变量内容符:$

读取方法:$变量名

# 变量内容读出例子,前提是这些变量提前定义了
[root@sql-master ~]# echo $name
baism
[root@sql-master ~]# echo $school
ayitula
[root@sql-master ~]# echo $age
30
[root@sql-master ~]# echo $score
88.8

# 注意:变量读取过程中,默认单引号是不解释变量的,比如
[root@sql-master ~]# echo '$name'
$name

# 如果必须使用单引号还要读取变量的值可以使用 eval 命令[重新运算求出参数的内容] 
[root@sql-master ~]# eval echo '$name'
baism

五、其他变量(扩展)

1)输出目录路径和该路径下的文件名称:dirname 和 basename 

2)变量内容输出参数:
一个 “%”  代表从右往左去掉一个/key/
两个 “%%” 代表从右往左最大去掉/key/
一个 “#”  代表从左往右去掉一个/key/
两个 “##” 代表从左往右最大去掉/key/

案例演示:

1.输出目录和文件名

[root@sql-master ~]# vi 2.sh
#!/bin/bash

A=/usr/local/mycat/version.txt
echo "上一级目录:`dirname $A`"
echo "文件名:`basename $A`"

[root@sql-master ~]# sh 2.sh 
上一级目录:/usr/local/mycat
文件名:version.txt

2.输出变量的长度

[root@sql-master ~]# url=www.baidu.com
[root@sql-master ~]# echo ${#url}     # 获取变量的长度
13
[root@sql-master ~]# echo ${url#*.}   # 以分隔符 "." 为界限 , *:匹配所有
baidu.com
[root@sql-master ~]# echo ${url##*.}
com
[root@sql-master ~]# echo ${url%.*}
www.baidu
[root@sql-master ~]# echo ${url%%.*}
www

 上一篇文章:【Shell 脚本速成】01、编程语言与 Shell 脚本介绍_Stars.Sky的博客-CSDN博客

参考文档:shell变量详解-组团学

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

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

相关文章

向前迈进!走入GC世界:G1 GC原理深入解析

第零章&#xff1a;名词解释 mutator&#xff1a;应用线程 STW&#xff1a;Stop-The-World&#xff0c;指除了GC线程&#xff0c;其它所有线程全部暂停的一段时间 并发&#xff1a;指代GC线程与mutator在同一时刻执行任务 并行&#xff1a;指代多个GC线程在同一时刻执行任务…

一站式元数据治理平台——Datahub

一站式元数据治理平台——Datahub万字保姆级长文——Linkedin元数据管理平台Datahub离线安装指南 - 独孤风 - 博客园 (cnblogs.com)企业级数据治理工作怎么开展&#xff1f;Datahub这样做 - 独孤风 - 博客园 (cnblogs.com)【DataHub】 现代数据栈的元数据平台–如何与spark集成…

如何设计金融机构多场景关键应用下的存储架构

【摘要】银行、保险等金融机构存在多场景下的关键应用,如何选择适合各场景下的存储,如何设计适合业务的存储架构,显得尤为重要。本文从当前主流存储架构分析入手,提出金融机构业务场景分析与架构选型思路,以Glusterfs为例,分享如何根据业务场景的特点,有针对性的选取适合…

SQL优化

文章目录提升group by的效率分页查询优化覆盖索引子查询起始位置重定义检查 where,order by,group by后面的列尽量使用 varchar 代替 char。&#xff08;SQL 性能优化&#xff09;如果修改 / 更新数据过多&#xff0c;考虑批量进行提升group by的效率 select user_id,user_nam…

spring-security源码学习总结

由于SpringBoot 对 Security 的支持类均位于org.springframework.boot.autoconfigure.security包下&#xff0c;主要通过 SecurityAutoConfiguration 自动配置类和 SecurityProperties 属性配置来完成&#xff0c;所以需要下载springboot源码深入学习 SecurityAutoConfiguratio…

云原生边缘设备解决方案Akri on k3s初体验

作者&#xff1a; 涂家英&#xff0c;SUSE 资深架构师&#xff0c;专注 Cloud-Native 相关产品和解决方案设计&#xff0c;在企业级云原生平台建设领域拥有丰富的经验。 写在前面 k3s 是 SUSE 推出的为物联网和边缘计算构建的经过认证的 Kubernetes 发行版&#xff0c;它可以帮…

指数函数及其导函数

目录前言指数函数的导函数指数函数导函数动图绘制参考文献前言 前面我们介绍了指数函数及其基本性质以及如何在笛卡尔直角坐标系下绘制静态的指数函数图像&#xff0c;这一节&#xff0c;我们将重点讨论一下指数函数的导函数以及导函数的动态表示&#xff0c;为方便起见&#…

大数据(9f)Flink富函数RichFunction

文章目录1、概述2、示例2.1、普通函数2.2、富函数2.2.1、获取富函数的运行时上下文3、源码截取3.1、RichFunction3.2、RuntimeContext1、概述 Rich Function&#xff0c;译名富函数&#xff0c;和普通函数相比&#xff0c;多了&#xff1a;生命周期&#xff08;open和close方法…

DGL学习笔记——第二章 消息传递范式

提示&#xff1a;DGL用户指南学习中 文章目录一、内置函数和消息传递API二、编写高效的消息传递代码总结消息传递是实现GNN的一种通用框架和编程范式。它从聚合与更新的角度归纳总结了多种GNN模型的实现。 假设节点 &#x1d463; 上的的特征为 &#x1d465;&#x1d463;∈ℝ…

Java(八)----多线程

1. 线程的基本概念 1.1 进程 任何的软件存储在磁盘&#xff08;硬盘&#xff09;中,运行软件的时候,OS&#xff08;操作系统&#xff09;使用IO技术,将磁盘中的软件的文件加载到内存,程序才能运行。 &#xff08;进程是从硬盘到内存&#xff09; 进程的概念 &#xff1a; 应…

Marked.js让您的文档编辑更加轻松自如!

低代码应用平台——kintone既可以保留更改记录&#xff0c;也有流程管理的功能&#xff0c;在公司内部分享会议记录啊、wiki等文档或学习资料等时非常的便利。 kintone还有丰富的文本编辑框&#xff0c;可以对内容进行编辑提高易读性。但是还是有不少人觉得如果能够使用Markdo…

19.[Python GUI] PyQt5中的模型与视图框架-基本原理

PyQt中的模型与视图框架 一、Qt中模型与视图相关的类 二、模型与视图的基本原理 MVC把图形界面分为三个部分&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;&#xff0c; 模型&#x…

Git大型文件存储

什么是 Git LFS&#xff1f; Git 是跟踪代码库演变和与同行高效协作的绝佳选择。但是&#xff0c;当您要跟踪的存储库非常大时会发生什么&#xff1f; 如果您考虑一下&#xff0c;存储库变得庞大的主要原因大致有两个&#xff1a; 他们积累了非常非常长的历史&#xff08;项目…

【C】文件操作fopen与fclose

目录 函数 1.fopen 2.fclose 3.freopen 函数 头文件 #include<stdio.h> 1.fopen FILE *fopen(const char *restrict dilename,const char* restrict mode); 作用&#xff1a;打开文件参数&#xff1a; 第一个是含有要打开文件名的字符串&#xff08;"文件名…

肝了一周的八万字Redis实战篇

Redis实战篇 文章目录Redis实战篇开篇导读1. 短信登录2. 商户查询缓存3. 优惠卷秒杀4. 附近的商户5. UV统计6. 用户签到7. 好友关注8. 达人探店一、短信登录1. 导入黑马点评项目1.1 导入SQL1.2 有关当前模型1.3 导入后端项目1.4 导入前端工程1.5 运行前端项目2. 基于Session实现…

【杂谈】快来看看如何使用LGMT这样的蜜汁缩写来进行CodeReview吧!

文章目录一、先从一个梗开始说起吧&#xff01;二、什么是LGTM&#xff1f;2.1 LGTM 是什么意思&#xff1f;2.2 蹭梗品牌故事2.3 虚假的CodeReview三、Code Review中的蜜汁缩写四、参考链接一、先从一个梗开始说起吧&#xff01; 公司最近在如火如荼的开展CodeReview活动&…

Reinforcement learning from demonstration through shaping(Wiewiora 2003)

摘要 强化学习中的一个重要问题是如何以有原则的方式整合专家知识&#xff0c;尤其是当我们扩展到现实世界的任务时。在本文中&#xff0c;我们提出了一种在不改变最优策略的情况下将任意建议纳入强化学习agent的奖励结构的方法。 该方法将 Ng 等人 (1999) 提出的基于势能的塑…

1530_AURIX_TriCore内核架构_通用寄存器以及系统寄存器

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 继续看一下内核手册&#xff0c;这次了解一下通用寄存器以及系统寄存器。最近一段时间最复位以及trap困扰了许久&#xff0c;看看这里面是否能够获取…

黄河水稻山东智慧 国稻种芯·中国水稻节:济南泉城米袋子

黄河水稻山东智慧 国稻种芯中国水稻节&#xff1a;济南泉城米袋子 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xff1a;又是一年春天。济南黄河流域吴家堡水稻田旁的…

数据挖掘与机器学习:数据挖掘算法原理与实践:数据预处理

目录 第一关&#xff1a;标准化 任务描述&#xff1a; 相关知识&#xff1a; 一、为什么要进行标准化 二、Z-score标准化 三、Min-max标准化 四、MaxAbs标准化 编程要求&#xff1a; 测试说明&#xff1a; 第二关&#xff1a;非线性转换 任务描述&#xff1a; 相关知…