Linux脚本的高级变量
Linux脚本中的高级变量,有3个主题:
高级变量3个主题
1. 变量扩展
2. 命令替换
3. 算术扩展
在Bash Shell中,$算符会触发上述3种扩展。其基本形式如下表:
基本型
扩展种类
范例
$(变量名称)
变量扩展
$(filename)
$(命令)
命令替换
$(ls /)
$((算术式))
算术扩展
$((9+9))
1变量扩展:测试存在性及空值
变量扩展不一定要在变量名称两侧添加{},但没有{}时,只能做简单的变量替换,并且如果后面接有数字、字母或下划线,容易造成bash误判变量名称,无法正确取值。因此最好的习惯还是加上{}。例如:echo "${filename}_in the house",可隔开变量名称和后接的字符串_in。
变量扩展是一种简易的条件判定,对不同的条件赋予变量不同的替换值。变量扩展是对基本型加上条件判定,如若条件符合(如不存在或空值),则进行变量替换。若不符合,也有相应的做法。其实是一种隐含的“if-then-else”的程序语法。
1.1“变量存在”的定义
如果变量曾设置过值,则称该变量存在;反之,不曾设置过值,或曾用unset取消变量,则称变量不存在或未定义。
需要注意:变量设值有两种情况:其值“非空”,与其值为“空”(null)两种。
myval='Linux'
此时变量myval的值非空
myval=
此时变量myval的值为空,其值以null表示
上面两种情况变量myval是存在的,或变量myval有定义。但若使用unset取消myval的定义,在变量myval不存在或myval没有定义。
1.2 测试变量“存在与否”的基本用法
语法:${待测变量-默认值}
判断条件:若变量不存在,则符合判断,以传回默认值作为处理。
解释:若待测试变量不存在,则传回-后方的默认值;但若变量存在,则传回变量的值。
例如:
01. unset myval
02. res=${myval-'Win7'}
03. echo $res
结果显示“Win7”。
如果变量myval存在,那么res的值就是myval的值,例如:
01. myval='Linux'
02. res=${myval-'Win7'}
03. echo $res
结果显示“Linux”。
除了关注变量是否存在外,变量是否为“空值”,也同样需要关注。在编写脚本时,通常把变量不存在和变量为空视为一类情况处理。
1.3 测试变量“不存在”或其值为空:返回一个默认值
语法:${待测变量:-默认值}
判断条件:若变量不存在或其值为空,则符合判断,以传回默认值作为处理。
解释:若待测试变量不存在或其值为空,则传回:-后方的默认值;但若变量存在且不为空,则传回变量的值。
例如:
01. myval=
02. res=${myval-'Win7'}
03. echo $res
结果显示“Win7”。
此处做个对比总结:
1. 若变量扩展的条件式中只有-这个符号,则只做变量“存在性”的判断。
2. 若变量扩展的条件式中使用:-这个符号,除了判断变量的“存在性”之外,还会加一个判断:变量是否为空值。
多了个冒号:,表示同时测试存在性及空值两种情况。
条件式特殊用法
变量扩展的语法经常会用在脚本的开头,如下:
[ -n ${DEBUG:-} ] && set -v
[]是测试条件的语法,其中-n是用来测试后接的变量是否有值(测试不为空),若非空,则传回真值。
${DEBUG:-}就是-n要测试的对象,这里:-后面原本放置默认值的地方却没有放置任何东西,表示故意要让默认值为空值。
这样做的目的是:如果变量DEBUG非空值,那么[-n]条件测试就会成了,接着执行逻辑AND的下一个指令set -v,于是脚本进入差错的模式;如果变量DEBUG没有设定或其值为空,则变量扩展的结果为空值,因此[-n]条件测试不成立,逻辑AND的下一个指令也就不再执行,查询的功能就没有打开。这样脚本切换差错模式就很方便,要排查错误,就给DEBUG设一个值,否则就是正常的执行模式。
1.4 测试变量“不存在”或其值为空:给变量赋一个默认值
语法:${待测变量:=默认值}
判断条件:若变量不存在或其值为空,则符合判断。
解释:若待测试变量不存在或其值为空,则把:=后方的默认值赋值给待测试变量;但若变量存在,则传回变量的值。
例如:
01. unset count
02. res=${count:=100}
03. echo $res
结果显示“100”。
01. count=500
02. res=${count:=100}
03. echo $res
结果显示“500”。
条件式的用途:给变量设置一个默认值。
1.5 测试变量是否“不存在”或其值为空:提示错误信息
语法:${待测变量:?提示信息}
判断条件:若变量不存在或其值为空,则符合判断。
解释:若待测试变量不存在或其值为空,则显示变量名称和:?后面的提示信息,并立即停止执行脚本script。
条件式的用途:确保某变量值一定要存在,否则如果继续执行下去,会发生严重错误。
如果该变量的值为空值,就显示预先准备好的错误提示信息,以提醒用户要特别注意。接着就结束脚本,不再继续执行下去。
例如:
01. #! /bin/bash
02. fn=${1:?'错误!请提供要删除的目录名称!'}
03.
04. echo '你要执行删除目录的命令是:'
05. echo "rm -Rf ~/$fn"
说明:
行2,对命令行传入的第一个参数$1做检查,若是空值,就显示错误信息,并停止执行fn.sh
行4~5,显示删除目录的指令。
若把行2注掉,即不对fn变量做检查,由于$fn是空值,整个删除目录的指令会变成“rm -Rf ~/$fn”。等于是要把个人目录下的所有文件删除。
1.6 测试变量的“存在性”
语法:${待测变量:+真值}
判断条件:若变量存在且其值不为空,则符合判断。
解释:若待测试变量存在且其值不为空,则传回真值;若不然,传回空值。
条件式的用途:用来测试某件事是真的。
例1:
01. IamHappy='Feel so good.'
02. r=${IamHappy:+'true'}
03. echo $r
说明:
行1,设定IamHappy非空值。
行2,由于IamHappy存在且非空,所以传回true,并将它设定值给r。
行3,显示r的内容(即true)
例2:
01. #! /bin/bash
02. exec grep -F ${1+"$@"}
说明:
这里是有exec执行grep程序,-F表示是有一串固定的字符串(可用换行字符分开)作为寻找的样式。其中${1+"$@"}的意思是说:若$1存在(指定要寻找的关键词),则传回所有的参数$@,这表示该脚本可以一次搜寻多个文件。
整理
:
空
测空值
-
负向
测不存在
=
设值
给空值变量设一个默认值
?
有问题
检查条件是否完备后再来执行吧
+
正向
测试存在
四种变量扩展:
:-,目的(回传的结果一定要有非空值),判断条件(测不存在或空值)
:=,目的(给空值变量设一个默认值),判断条件(测不存在或空值)
:?,目的(检查条件是否完备),判断条件(测不存在或空值)
:+,目的(判断某事是否为真),判断条件(测试存在且非空)
未完待续~~~
如何关注
①复制“Linux脚本之家或LinuxSheller”,在“添加朋友”中粘贴搜索号码关注。