Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
上一节,我们对变量有了初步的了解,学会了变量的分类以及各种变量的基本操作和作用。本节我们来了解以下变量运算和运算符、变量测试和内容替换、环境变量配置文件相关内容。
Bash变量的数值运算
变量的数值运算,就是对变量的加减乘除等数学运算。但是,当我们想当然地执行以下“+”操作,会发现根本不能得到正确结果
#省略命令提示符 a=123 b=456 c=$a+$b echo $c #得到以下结果 123+456
原来,Bash中的变量默认都是字符串型变量,而Bash又没有其他语言中的隐式变量类型转换,所以不能得到正确结果
那么,如何才能使变量支持数值运算呢?答案是用
declare命令手动声明变量的类型
声明变量类型
declare [+/-] [选项] 变量名称
选项/标识 | 作用 |
---|---|
- | 给变量设定类型属性 |
+ | 取消变量的类型属性 |
i | integer 声明变量为整数型 |
x | export 声明变量为环境变量 |
-p | 显示指定变量的类型 |
- 注意,设定与取消的标识与一般情况相反,
-
为设定类型;+
为取消设定 - 也可以在
declare
命令中直接声明一个新的变量并声明其类型
例如,
a=1 declare -i a declare -p a declare -i a="1" #此行为上一行查询变量类型的返回值 export a declare -p a declare -ix a="1" #此行为上一行查询变量类型的返回值
声明数值类型后,变量就支持数值运算了
数值运算
-
已经声明为数值型的变量可以进行数值运算和赋值运算
-
注意,在给一个新变量赋值之前,必须将该变量声明为数值变量,否则会出现示例中结果
#上文已经声明数值变量a=1,b=2 zheng@Kali:~/Shell$ c=$a+$b zheng@Kali:~/Shell$ echo $c 1+2
因为未经声明的变量依然默认为字符串型,Shell将后面的值识别成字符串而没有使用数值运算。
而下面的例子中得到了正确结果
zheng@Kali:~/Shell$ declare -i c=$a+$b #同样可以将变量声明与赋值放在一行中 zheng@Kali:~/Shell$ echo $c 3
- 如果变量未经声明,仍然可以用数值运算工具进行隐式类型转换与数值计算
zheng@Kali:~/Shell$ a=1 zheng@Kali:~/Shell$ b=2 zheng@Kali:~/Shell$ c=$(expr $a + $b) zheng@Kali:~/Shell$ echo $c 3 zheng@Kali:~/Shell$ declare -p c declare -- c="3" #c仍然是一个字符串型变量
-
在进行expr运算时,用
$()
包含值表示将该命令的运算结果而不是其本身赋值给变量 -
注意,"+"两侧必须存在空格,与变量赋值语句不同,进行数值运算并被赋值的结果变量若不加声明仍是字符串变量
-
以上的数值运算工具格式上并不符合常用数学格式,不建议使用
-
下面提供了两种推荐的数值运算符号,
$(())
与$[]
,#上文声明a=1,b=2,且a b均 不 是数值型变量 zheng@Kali:~/Shell$ c=$(($a+$b)) zheng@Kali:~/Shell$ echo $c 3 zheng@Kali:~/Shell$ c=$[$a+$b] zheng@Kali:~/Shell$ echo $c 3
+
运算符两边的空格可要可不要
其他运算符
其他运算符以及运算优先级(越大越优先)
优先级 | 运算符 | 说明 |
---|---|---|
13 | + - | 正负 符号运算 |
12 | ! ~ | 逻辑非,计算补码(按位取反) |
11 | * / % | 乘、整除、取模 |
10 | + - | 加减 |
9 | << >> | 按位左移,按位右移 |
8 | <= >= < > | 数值大小运算判断 |
7 | == != | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | = | 赋值 |
运算符举例:
zheng@Kali:~/Shell$ echo $[12*3/9+4] 8 zheng@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编程(四):变量(上) 变量分类与相关操作
- bash变量-数值运算与运算符/变量测试与内容替换/环境变量配置文件
- LINUX Bash变量测试与内容替换, 环境变量配置文件, 其他配置文件和登入信息
- maven多环境配置文件设置,打包是配置文件变量替换
- Ubuntu Linux系统环境变量配置文件介绍
- Ubuntu 环境变量配置文件介绍
- Ubuntu系统环境变量配置文件(转)
- Ubuntu Linux系统环境变量配置文件介绍 转自:http://tech.16c.cn/linux/glpz/20090620/6586.html
- Ubuntu 用/ect/profile文件配置JAVA环境变量
- Linux中环境变量文件及配置
- 1.3-系统和用户的环境变量配置文件
- Ubuntu环境变量配置文件简介
- Spring PropertyPlaceholderConfigurer Usage - 使用系统变量替换spring配置文件中的变量
- 测试环境自动部署:抓取war包,备份,替换配置文件,部署到tomcat下并重启
- Windows7中Java64位环境变量配置:javac不是内部命令或外部命令,也不是可运行的程序或批处理文件。
- Ubuntu Linux系统环境变量配置文件简介
- Shell基础-环境变量配置文件-其他配置文件和登录信息
- 在环境变量中为Tomcat配置一个java_home Tomcat在启动的时候,有时候不是很好启动,在server.xml文件下多配置几次端口号就行了。
- tslib的环境变量、配置文件等进行简要的分析 转
- linux各环境变量配置文件简单总结介绍
- python 学习记录(11)-文件处理/读取文件/文件写入内容/文件删除/文件复制/文件重命名/后缀名/内容查找与替换/文件比较/ 配置文件访问/目录创建与删除/遍历目录/定向输出