Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
上一节,我们对变量有了初步的了解,学会了变量的分类以及各种变量的基本操作和作用。本节我们来了解以下变量运算和运算符、变量测试和内容替换、环境变量配置文件相关内容。
Bash变量的数值运算
变量的数值运算,就是对变量的加减乘除等数学运算。但是,当我们想当然地执行以下“+”操作,会发现根本不能得到正确结果
#省略命令提示符a=123b=456c=$a+$becho $c#得到以下结果123+456
原来,Bash中的变量默认都是字符串型变量,而Bash又没有其他语言中的隐式变量类型转换,所以不能得到正确结果
那么,如何才能使变量支持数值运算呢?答案是用
declare
命令手动声明变量的类型
声明变量类型
declare [+/-] [选项] 变量名称
选项/标识 | 作用 |
---|---|
– | 给变量设定类型属性 |
+ | 取消变量的类型属性 |
i | integer 声明变量为整数型 |
x | export 声明变量为环境变量 |
-p | 显示指定变量的类型 |
- 注意,设定与取消的标识与一般情况相反,
-
为设定类型;
+
为取消设定
- 也可以在
declare
命令中直接声明一个新的变量并声明其类型
例如,
a=1declare -i adeclare -p adeclare -i a=\"1\" #此行为上一行查询变量类型的返回值export adeclare -p adeclare -ix a=\"1\" #此行为上一行查询变量类型的返回值
声明数值类型后,变量就支持数值运算了
数值运算
-
已经声明为数值型的变量可以进行数值运算和赋值运算
-
注意,在给一个新变量赋值之前,必须将该变量声明为数值变量,否则会出现示例中结果
#上文已经声明数值变量a=1,b=2zheng@Kali:~/Shell$ c=$a+$bzheng@Kali:~/Shell$ echo $c1+2
因为未经声明的变量依然默认为字符串型,Shell将后面的值识别成字符串而没有使用数值运算。
而下面的例子中得到了正确结果
zheng@Kali:~/Shell$ declare -i c=$a+$b #同样可以将变量声明与赋值放在一行中zheng@Kali:~/Shell$ echo $c3
- 如果变量未经声明,仍然可以用数值运算工具进行隐式类型转换与数值计算
zheng@Kali:~/Shell$ a=1zheng@Kali:~/Shell$ b=2zheng@Kali:~/Shell$ c=$(expr $a + $b)zheng@Kali:~/Shell$ echo $c3zheng@Kali:~/Shell$ declare -p cdeclare -- c=\"3\" #c仍然是一个字符串型变量
-
在进行expr运算时,用
$()
包含值表示将该命令的运算结果而不是其本身赋值给变量
-
注意,\”+\”两侧必须存在空格,与变量赋值语句不同,进行数值运算并被赋值的结果变量若不加声明仍是字符串变量
-
以上的数值运算工具格式上并不符合常用数学格式,不建议使用
-
下面提供了两种推荐的数值运算符号,
$(())
与
$[]
,
#上文声明a=1,b=2,且a b均 不 是数值型变量zheng@Kali:~/Shell$ c=$(($a+$b))zheng@Kali:~/Shell$ echo $c3zheng@Kali:~/Shell$ c=$[$a+$b]zheng@Kali:~/Shell$ echo $c3
+
运算符两边的空格可要可不要
其他运算符
其他运算符以及运算优先级(越大越优先)
优先级 | 运算符 | 说明 |
---|---|---|
13 | + – | 正负 符号运算 |
12 | ! ~ | 逻辑非,计算补码(按位取反) |
11 | * / % | 乘、整除、取模 |
10 | + – | 加减 |
9 | << >> | 按位左移,按位右移 |
8 | <= >= < > | 数值大小运算判断 |
7 | == != | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | = | 赋值 |
运算符举例:
zheng@Kali:~/Shell$ echo $[12*3/9+4]8zheng@Kali:~/Shell$ echo $[10 << 1]20 #算术左移一位相当于将原数*2,但运算速度较乘2的幂次快得多zheng@Kali:~/Shell$ echo $[!(1 && 0)]1 #1与0为0,取非后为1
若不了解运算相关知识,请自行探索,本文不再赘述
内容替换与变量测试
内容替换,指用如下方式(目标变量为x,条件变量为y,以
1
代替新值(可以替换,仅作为测试,结果中的
1
也为新值)),替换目标变量(也可能是条件变量)的内容,以新值代替
变量置换方式 | y没有设置 | y为空 | y存在值 |
---|---|---|---|
x=${y-1} | x=1 | x为空 | x=$y |
x=${y:-1} | x=1 | x=1 | x=$y |
x=${y+1} | x为空 | x=1 | x=1 |
x=${y:+1} | x为空 | x为空 | x=1 |
x=${y=1} | x=1 y=1 | x为空 y值不变 | x=$y y值不变 |
x=${y:=1} | x=1 y=1 | x=1 y=1 | x=$y y值不变 |
x=${y?1} | 新值输出到标准错误输出 | x为空 | x=$y |
x=${y:?1} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
- 上表中语句逻辑较混乱,内容较多,仅作为了解即可,必要使用时可作参考
变量置换的不同结果可用于判断条件变量是否存在以及是否为空,即在不使用echo命令输出在显示器上手动查看变量的情况下测试变量,此即变量测试
环境变量配置文件
环境变量配置文件简介
- 环境变量配置文件是系统配置文件,主要定义了对操作系统环境永久生效(可修改)的系统默认环境变量
- 环境变量配置文件中包含的主要环境变量:
PATH
HISTSIZE
(历史命令保存数量)
PS1
HOSTNAME
等
说到配置文件,首先介绍
source
命令,可使配置文件立即生效,免去了重新登录的麻烦
source [filename]#例如,以下命令使对.bashrc(Bash配置文件)的修改立刻生效source ~/.bashrc
主要的环境变量配置文件
环境变量配置文件 | 说明 |
---|---|
/etc/profile | 全局环境变量设定文件,系统级初始化 |
/etc/profile.d/*.sh | /etc/profile文件的拓展文件夹,其中内容与该文件效用相同 |
~/.bash_profile | 对单个用户有效的Bash初始化文件 |
~/.bashrc | 对单个用户生效的Bash启动配置文件 |
/etc/bash.bashrc | 对系统中所有用户都生效的Bash启动配置文件 |
环境变量配置文件作用
环境变量配置文件调用顺序(调用顺序对环境变量定义可能产生影响,后调用并定义的环境变量配置可能覆盖前面定义的)
以上文件在登录时进行读取初始化,将其中的环境变量读入内存中
-
/etc/profile
定义环境变量
USER
LOGNAME
MAIL
PATH
HOSTNAME
HISTSIZE
UMASK
- 调用
./profile.d
目录,读取其中内容
~/.bash_profile
(可能不存在,功能被整合入
~/.bashrc
)
- 调用
./.bashrc
文件
/etc/bash.bashrc
- 定义环境变量
PS1
环境变量配置文件的作用在不同发行版的 linux 系统中有部分不同,请注意区分
其他配置文件和登录信息
其他配置文件
-
~/.bash_logout
用户退出登录时执行,用于保护隐私和其他操作
-
~/.bash_history
命令历史记录,使用history命令调用,详见Linux Bash Shell编程(二):Bash基本功能(历史、补全、快捷键)
登录信息
-
在用户登录时会显示的登录提示信息,本地用户登录信息的设置在配置文件
/etc/issue
中
这个文件支持转义符使用
转义符 | 作用 |
---|---|
\\d | 显示当前系统日期 |
\\s | 显示操作系统名称 |
\\l | 显示登录的终端号 |
\\m | 显示硬件架构 |
\\n | 显示主机名 |
\\o | 显示域名 |
\\r | 显示内核版本 |
\\t | 显示系统时间 |
\\u | 显示当前登录的用户ID |
-
对于远程登录的用户的欢迎信息在
/etc/issue.net
中(具体文件名称也可以配置修改)
这个文件不允许使用转义符,且在ssh登录中默认不会显示,要在ssh登录配置文件
/etc/ssh/sshd_config
中设置
#这是原文件中的其中一行内容#Banner no#将其换为(或直接增加一行)Banner /etc/issue.net#文件名称可以在这里修改
-
登录以后(输入密码成功登录),会显示另一个欢迎信息,本地登录和远程登录都会出现,配置文件在
/etc/motd
下一节,Linux Bash Shell编程(六):正则表达式 基本元字符应用示例 我们将了解正则表达式的基本用法
上一节,Linux Bash Shell编程(四):变量(上) 变量分类与相关操作