【Shell 脚本速成】02、Shell 变量详解
创始人
2024-02-08 09:09:49
0

目录

一、变量介绍

变量存取原理

二、变量定义

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<==>0x5d、释放内存
从内存跟踪表中将记录删除,下次存数据直接覆盖

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/bashecho $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/bashecho "\$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/bashA=/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变量详解-组团学

相关内容

热门资讯

卡莱尔的名言 卡莱尔的名言  1、天才就是无止境刻苦勤奋的能力。——卡莱尔  2、只有传记是真实的历史。——卡莱尔...
经典古文名言 经典古文名言大全  名言基本意思是很出名的说法,著名的话,一般指名人说的话。下面和小编一起来看经典古...
培根的至理名言佳句 培根的至理名言佳句  1、暂时解接的人,不能算是冤家。  2、读书使人成为完善的人。  3、天性好比...
教育家名言_教育名言名句   教师个人的范例,对于青年人的心灵,是任何东西都不能代替的最有用的阳光。如下是中国人才网给大家整理...
小学教育格言   小学教育格言  1、教学是发现,是分享,是成长,是兴奋和爱。——钱艳  2、礼貌是最容易做到的事...
小学生格言   小学生格言  1、不怕慢,就怕站。  2、树挪死,人挪活。  3、沉思的生活是美好的生活。  4...
刘基的名言 刘基的名言  1、邦无道,富加贵,耻也!  2、大其心,容天下之物;虚其心,受天下之善;平其心,论天...
蒋晓云的经典名言 蒋晓云的经典名言  我独自发着‘思古之幽情’,实际却好像在一个电影布景里。  虽然学历并没影响她一生...
菜根谭修身名言名句 菜根谭修身名言名句,以下是大学网小编精心整理的相关文章,希望对大家有所帮助!菜根谭修身名言名句欲做精...
读书的名人名言 读书的名人名言(通用190句)  读书之法无他,惟是笃志虚心,反复详玩,为有功耳。下面是小编为你整理...
经典的名人名言180条 经典的名人名言(精选180条)  在平平淡淡的学习、工作、生活中,大家都知道一些经典的名言吧。以下是...
科学家的名言 科学家的名言集锦  名言基本意思是很出名的说法,著名的话,一般指名人说的话。下面和小编一起来看科学家...
屈原名言名句 屈原名言名句  无论在学习、工作或是生活中,大家都接触过很多优秀的名言吧,名言是我国文化悠久,博大精...
德谟克利特名言名句阅读欣赏 德谟克利特名言名句大全阅读欣赏  德谟克利特名言名句大全  1、单单一个有智慧的人的友谊,要比所有愚...
人生哲理格言 人生哲理格言合集50句  人生需要积累,更需要沉淀,要常回头看看,用足够的时间去反思,在品味得失和甘...
热爱工作励志名言名句 热爱工作励志名言名句  在学习、工作或生活中,大家一定都接触过一些使用较为普遍的名言吧,巧用名言有助...
生命的格言 关于生命的格言(精选90句)  无论是在学校还是在社会中,大家都不可避免地会接触并使用名言吧,在议论...
反省的名人名言 关于反省的名人名言  在日常学习、工作和生活中,大家都知道一些经典的名言吧,名言具有概括自然有力,言...
人生格言座右铭短句 人生格言座右铭短句  用心工作,用心生活,用心感悟,人生格言座右铭短句。下面是由应届毕业生小编为大家...
踏实勤奋的名言警句 踏实勤奋的名言警句  不积跬步,无以至千里;不积小流,无以成江海。接下来小编搜集了踏实勤奋的名言警句...