linux高级的脚本,必须掌握的Linux脚本的高级变量(一)

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”,在“添加朋友”中粘贴搜索号码关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值