当前位置:网站首页>shell之变量详解,让你秒懂!
shell之变量详解,让你秒懂!
2022-08-09 18:33:00 【InfoQ】
一、变量介绍
计算机的单位:
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
...
好了,已经够大了!当然还有YB、BB更大的单位,同样进制也是1024.
1G=1024*1024*1024=1073741824B
变量存取原理
关于内存的说明
a、系统启动 内存被按照1B一个单位划分成N块 并且以十六进制为每一个空间编号
b、内存跟踪表记录 使用和未使用的内存的地址编号
c、内存申请 系统从未使用的内存中拿出一个或者一段连续空间 给你使用 同时在内存跟踪表中记录
该地址被占用不在分给别人,同时在系统中建立映射机制
比如:变量名 STRING1=‘ABC’
name<==>0x5
d、释放内存
从内存跟踪表中将记录删除,下次存数据直接覆盖

- a、内存占用:如果存的是一个字符则占用1个字节,如果存的是字符串则是字符串的长度加1个字节长度(\0是一个特殊字符,代表字符串结束)。
- b、变量名与内存空间关系:计算机中会将对应的内存空间地址和变量名称绑定在一起,此时代表这段内存空间已经被程序占用,其他程序不可复用;然后将变量名对应的值存在对应内存地址的空间里。
二、变量定义
2.1、什么时候需要定义变量?
2.2、定义一个变量
变量名命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
定义变量举例:
VAR1=1
age=18 整形
name=‘baism’ 字符串
score=88.8 浮点
定义变量演示:
[[email protected] ~]# name="liza"
[[email protected] ~]# school='beida'
[[email protected] ~]# age=30
[[email protected] ~]# score=88.8
2.3、取消变量 unset
取消当前环境中的变量,如果是变量设置是保存在文件中,下次重启又会恢复
[[email protected] ~]# unset name
[[email protected] ~]# echo $name
2.4、 有类型变量 declare
[[email protected] ~]# declare -i num='asa'
[[email protected] ~]# echo $num
0
[[email protected] ~]# num=100
[[email protected] ~]# echo $num
100
[[email protected] ~]# declare -r num
[[email protected] ~]# echo $num
100
[[email protected]~]# num=200
-bash: num: 只读变量
[[email protected] ~]# declare -x
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="Bai_Shuming"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
三、变量分类
3.1、本地变量
3.2、环境变量
.bashrc
.bash_profile
3.3、将当前变量变成环境变量 export
定义一个临时变量
1、
[[email protected] tmp]# export A=hello //临时将一个本地变量(临时变量)变成环境变量
[[email protected] tmp]# env|grep ^A
A=hello
2、
[[email protected] tmp]# A=HELLO
[[email protected] tmp]# export A
3、定义一个永久生效变量:
vim .bash_profile 或者 ~/.bashrc
A=hello
关于export说明
- 用户登录时:
- 用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序。
- 运行脚本时:
- 运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,
- 另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell

3.4、全局变量
export
/etc/profile /etc/bashrc
打印全局变量 printenv
定义格式
export SCHOOL='zutuanxue'
测试方法:
通过不同用户登录测试是否能读取变量
3.5、内置变量
$?
- 若退出状态值为0,表示命令运行成功
- 若退出状态值为127,表示command not found
- 若退出状态值为126,表示找到了该命令但无法执行(权限不够)
- 若退出状态值为1&2,表示没有那个文件或目录
$$
echo $$ eg:kill -9 `echo $$` = exit 退出当前会话
$!
!$
!!
$#
$*
$0
./1.sh a b c
[[email protected] shell01]# cat 2.sh
#!/bin/bash
#xxxx
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\[email protected] = [email protected]"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"
$*
$*
:表示将变量看成一个整体
- :表示变量是独立的
#!/bin/bash
for i in "[email protected]"
do
echo $i
done
echo "======我是分割线======="
for i in "$*"
do
echo $i
done
[[email protected] shell01]# bash 3.sh a b c
a
b
c
======我是分割线=======
a b c
变量总结说明:

四、变量取值
变量内容读出
[[email protected] ~]# echo $name
baism
[[email protected] ~]# echo $school
ayitula
[[email protected] ~]# echo $age
30
[[email protected] ~]# echo $score
88.8
注意
[[email protected] ~]# echo '$name'
$name
[[email protected] ~]# eval echo '$name'
liza
五、其他变量(扩展)
- 取出一个目录下的目录和文件:dirname和 basename
- 变量"内容"的删除和替换一个
%
代表从右往左去掉一个/key/
两个%%
代表从右往左最大去掉/key/
一个#
代表从左往右去掉一个/key/
两个##
代表从左往右最大去掉/key/
# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目录
/root/Desktop/shell
# basename $A 取出文件
mem.txt
# url=www.taobao.com
# echo ${#url} 获取变量的长度
# echo ${url#*.} 以分隔符.界限 *匹配所有
# echo ${url##*.}
# echo ${url%.*}
# echo ${url%%.*}
边栏推荐
猜你喜欢
国产抗新冠口服药每瓶不超300元/ 我国IPv6网络全面建成/ 谷歌入局折叠屏手机...今日更多新鲜事在此...
论文精读:VIT - AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
重磅!上海985教授当选!全球仅4人!
Bi Sheng Compiler Optimization: Lazy Code Motion
史上最全架构师知识图谱(纯干货)
ebook下载 | 《 企业高管IT战略指南——企业为何要落地DevOps》
没有 accept,建立 TCP 连接,可以吗?
基于CC2530 E18-MS1-PCB Zigbee DIY作品(三)
IDEA tools commonly used configuration
论文分享:「FED BN」使用LOCAL BATCH NORMALIZATION方法解决Non-iid问题
随机推荐
基于CC2530 E18-MS1-PCB Zigbee DIY作品
WPF 实现带蒙版的 MessageBox 消息提示框
sublime快速打开终端terminal
放下手机吧:实验表明花20分钟思考和上网冲浪同样快乐
C的一些琐碎
[免费专栏] Android安全之动态代码注入技术(利用JDB调试APK)
winpe工具WEPE微PE工具箱
Iptables防火墙常见的典型应用场景
使用.NET简单实现一个Redis的高性能克隆版(四、五)
std::atomic_flag的test_and_set函数理解
正则表达式(全)
重磅!上海985教授当选!全球仅4人!
vim编辑器使用
每周给我10分钟,我给你一个Flink SQL 菜谱——甜点:数据过滤
什么是ROS
环境:Flink版本:1.15.1jar包:flink-sql-connector-oracle
MFC教程
三面(技术 +HR 面试)网易,分享我的面试经验!(已拿 offer)
典型的数据仓库模型实施过程详解
ebook下载 | 《 企业高管IT战略指南——企业为何要落地DevOps》