十一、变量的高级用法
1 内部变量
1.1 BASH
-
定义
BASH记录bash shell 的路径,通常为/bin/bash
-
其他说明
- 内部变量SHELL就是通过BASH的值确定当前Shell的类型
1.2 BASH_SUBSHELL
-
定义
BASH_SUBSHELL记录了子Shell的层次
1.3 BASH_VERSINFO
-
定义
BASH_VERSINFO是一个数组,包含6哥元素,用于表示bash的版本信息
BASH_VERSINFO[0]表示bash shell的主版本号 BASH_VERSINFO[1]表示bash shell的次版本号 BASH_VERSINFO[2]表示bash shell的补丁级别 BASH_VERSINFO[3]表示bash shell的编译版本 BASH_VERSINFO[4]表示bash shell的发行状态 BASH_VERSINFO[5]表示bash shell的硬件架构
1.4 BASH_VERSION
-
定义
linux系统的bash shell版本包含主次版本、补丁级别、编译版本和发行状态,即BASH_VERSINFO数组取值为0~4
1.5 DIRSTACK
-
定义
DIRSTACK记录了栈顶目录值,初值为空
-
其他
-
pushd命令用于将某目录压入目录栈,同时将当前工作目录切换到入栈的目录
pushd 目录名
-
popd命令将栈顶目录弹出,栈顶元素变为下一个元素,同时将当前工作目录切换到当前栈顶目录
popd
-
dirs命令用于显示目录栈的所有内容
-
pushd和popd命令执行成功将自动激活dirs命令以显示当前目录栈的内容
-
1.6 GLOBIGNORE
-
定义
GLOBIGNORE是由冒号分隔的模式列表,表示通配(globbing)时忽略的文件名集合
-
说明
- 通配是把一个包含通配符的非具体文件名扩展到存储在计算机、服务器或者网络上的一批具体文件名的过程,一旦GLOBIGNORE非空,shell会将通配得到的结果中符合GLOBIGNORE模式中的目录去掉
-
用法
~$: GLOBIGNORE="ar*" # 在命令行中,通过赋值的方式设定
1.7 GROUPS
-
定义
GROUPS是一个数组,数组记录了当前用户所属的所有群组号
-
说明
linux管理用户组的文件是/etc/group,每个群组对应该文件中的一行,并用冒号分成四个域
cat /ect/group # 群组名:加密后的组命令:群组号:组成员列表
1.8 HOSTNAME
-
定义
HOSTNAME记录了主机名
-
说明
- 主机名是网络配置时必须要设置的参数
- /etc/sysconfig/network文件中设置主机名
- /etc/hosts文件用于设定IP地址和主机名之间的对应关系,以利于快速从主机名查找到IP地址
1.9 HOSTTYPE和MACHTYPE
-
定义
HOSTTYPE和MACHTYPE一样,都用于记录系统的硬件架构,与BASH_VERSINFO[5]等值。
1.10 OSTYPE
-
定义
OSTYPE记录了操作系统类型,即在linux中,$OSTYPE=linux
1.11 REPLY
-
read命令
-
定义
read命令用于读取标准输入(stdin)的变量值
-
用法
read variable
- variable是变量名
- read将读到的标准输入存储到variable变量中
- read命令不带任何变量名时,则将读到的标准输入存储到REPLY变量中
-
-
select命令
-
说明
select 自动将list形成有编号的菜单,用户输入序号以后,该序号所对应的list中的字符串赋给variable变量,而序号值则保存到REPLY变量中.
-
1.12 SECONDS
-
定义
SECONDS记录脚本从开始执行到结束所耗费的时间,以秒为单位
1.13 SHELLOPTS
-
定义
SHELLOPTS记录了处于“开”状态的shell选项(options)列表,为一个只读变量,该变量用冒号分隔记录shell选项。
-
说明
-
shell选项用于改变shell的行为
-
一个shell选项有"开"和"关"两种状态
-
set命令用于打开或关闭选项:
set -o optionname # 打开名为optionname选项 set +o optionname # 关闭名为optionname选项
-
1.14 SHLVL
-
定义
SHLVL记录了bash shell嵌套的层次
-
说明
- 当启动第一个shell时,\(SHLVL=1,当在这个shell中执行脚本,脚本的\)SHLVL=2,一次类推
1.15 TMOUT
-
定义
TMOUT变量用于设置shell的过期时间
-
说明
- 当TMOUT不为0时,shell在TMOUT秒后将自动注销
- TMOUT放在脚本中,可以规定脚本的执行时间
2 字符串处理
bash shell提供的多种字符串处理命令,可以归类为两种:
1.awk命令
2.expr命令
expr命令,引出通用求值表达式,可以实现算术操作、比较操作、字符串操作和逻辑操作等功能。
2.1 ${#...}和expr length
-
定义
计算字符串长度
-
用法
${#string} expr length $string
-
说明
- 当\(string中包含了空格,如果不用双引号将\)string引起,shell认为expr length后面是带了多个参数,而expr length后面只能跟一个参数
2.2 expr index
-
定义
在字符串\(string上匹配\)substirng中字符第一次出现的位置,若在\(string上匹配不到\)substring中的任何字符,expr index返回0
-
语法
expr index $string $substring
-
说明
- 当整个\(substring不全在\)string中时,index不管substring中的字符次序,仍然按照字符在string中的出现位置返回结果
2.3 expr match
-
定义
在字符串string的开头匹配substring字符串,返回匹配到的substring字符串的长度,若string开头匹配不到substring,则返回0 -
语法
expr match $string $substring
-
说明
- substring可以是字符串,也可以是正则表达式
2.4 抽取字串:#{...}和expr substr
-
#
-
语法
(1) #{string:position} #从名称为$string的字符串的第$position个位置开始抽取子串 (2) #{string:position:length} #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
-
说明
- #{...}格式的命令从0开始对名称为$string的字符串进行标号
${string: -position}
\(position为负数时,表示从\)string右边开始计数抽取子串,需要注意的是:冒号与横杠之间一定要有空格${string:(-position)}
表示从$string右边开始计数抽取子串,冒号与横杠之间不需要空格
-
-
expr substr
-
语法
expr substr $string $position $length #表示从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
-
说明
- expr substr命令从1开始对名称为$string的字符串进行标号
- expr substr命令中的$length是必不可少的,如果缺少,会报错
-
-
其他说明
使用正则表达式只能抽取$string开头处或结尾处的子串
-
抽取开头处子串
expr match $stirng '\($substring\)' expr $string : '\($substring\)' #冒号前后都有一个空格
-
抽取结尾处子串
expr match $match '.*\($substring\)' expr $string : '.*\($substring\)' #.*可以理解为:任意字符的任意重复
-
2.5 删除子串
-
定义
将原字符串中符合条件的子串删除,格式为$
-
语法
(1) ${string#substring} #删除string开头处与substring匹配的最短子串 (2) ${string##substring} #删除string开头处与substring匹配的最长子串
(1) ${string%substring} #删除string结尾处与substring匹配的最短子串 (2) ${string%%substring} #删除string结尾处与substring匹配的最长子串
2.6 替换子串
-
定义
替换子串命令都是${...}格式,可以在任意处(包括开头处和结尾处)替换满足条件的子串
-
语法
(1) ${string/substring/replacement} # 仅替换第一次与substring相匹配的子串 (2) ${string//substring/replacement} # 替换所有与substring相匹配的子串 (3)${string/#substring/replacement} # 替换string开头处与substring相匹配的子串 (4)${string/%susbtring/replacement} # 替换string结尾处与substring相匹配的子串
3 有类型变量
shell变量一般是无类型的,bash shell提供了declare和typeset两个命令用于指定变量的类型,两个变量完全等价
-
语法
declare [选项] 变量名
-
选项及其意义
选项名 意义 -r 将变量设置为只读属性 -i 将变量定义为整型数 -a 将变量定义为数组 -f 显示此脚本前定义过的所有函数名及其内容 -F 仅显示此脚本前定义过的所有函数名 -x 将变量声明为环境变量 -
双圆括号
-
作用
1.shell将双圆括号内的表达式解析为算术运算
result=$((variable1*variable2))
2.使bash shell实现C语言风格的变量操作
((a = 2009)) # 使等号两端各有一个空格 ((a++)) # 使用自加或自减符号 # 其他逻辑判断、三元操作符
-
-
declare -x
-
相当于export命令
-
declare -x允许在声明变量为环境变量的同时给变量赋值,而export命令不支持此功能
declare -x variable-name=value
-
4 间接变量引用
-
定义
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
variable1=variable2 variable2=value
-
语法
(1) eval tempvar=\$$variable1 echo "$tempvar" (2) tempvar=${!variable1}
-
示例
#! /bin/bash variable1=variable2 varibale2=Hadoop echo "variable1=$variable1" eval tmpvar=\$$variable1 echo "variable1=$tmpvar" echo "variable1=${!variable1}"
5 bash数学运算
-
expr命令的操作符及其意义
操作符 意义 arg1 | arg2 当arg1不为空且非零时,返回arg1,否则返回arg2 arg1 & arg2 当arg1不为空且非零时,返回arg1,否则返回0 arg1 < arg2 当arg1小于arg2时,返回1,否则返回0 arg1 <= arg2 当arg1小于等于arg2时,返回1,否则返回0 arg1 > arg2 当arg1大于arg2时,返回1,否则返回0 arg1 >= arg2 当arg1大于等于arg2时,返回1,否则返回0 arg1 != arg2 当arg1不等于arg2时,返回1,否则返回0 arg1 = arg2 当arg1等于arg2时,返回1,否则返回0 arg1 + arg2 返回arg1和arg2之和 arg1 - arg2 返回arg1和arg2之差 arg1 * arg2 返回arg1和arg2之积 arg1 / arg2 返回arg1除以arg2的商数 arg1 % arg2 返回arg1除以arg2的余数 -
说明
-
当expr命令的操作符是元字符,即该操作符还有其他含义时,需要用专业符将操作符的特殊含义屏蔽,才能使expr成功地执行数学运算
expr 2020 \* 2
-
expr操作符两端必须有空格,否则将不执行数学运算
-
-
bc运算器
-
定义
bash shell中最常用的浮点数运算工具
-
bc运算器的操作符及其意义
操作符 意义 arg1 + arg2 返回arg1和arg2之和 arg1 - arg2 返回arg1和arg2之差 arg1 * arg2 返回arg1和arg2之积 arg1 / arg2 返回arg1除以arg2的商数
(按scale变量设定结果的小数位数)arg1 % arg2 返回arg1除以arg2的余数 arg1 ^ arg2 返回arg1的arg2次方,指数运算 ++arg 或 arg++ 自加操作 --arg 或 arg-- 自减操作 -
说明
-
bc运算器定义了内建变量scale用于设定除法运算的精度,默认情况下,scale变量等于0,即除非运算的结果将自动取整
-
bc命令后加上-q选项,使得bc运算器不输出版本信息
bc -q
-
-
-
命令替换
命令替换可以将bc运算器的结果赋给一个shell变量
-
语法
variable='echo "options;expression" | bc'
-
说明
- variable是变量名
- echo命令后options部分一般用于设置scale变量
- expression是数学运算表达式
- echo的结果通过管道符传输给bc命令,将expression的结果赋给variable变量
-
示例
tmpvar='echo "scale=5;12 ^ 2 " | bc'
-