一.eval命令
语法:eval cmdLine
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。
例如:
为了输出最后一个参数有如下程序:
其中echo $4是在知道总共有4个数的情况下,直接输出第4个;当不知道总共有多少个数的情况下尝试使用echo "\$$#"输出最后一个数,结果并没有达到想要的结果;而 eval echo "\$$#"在不知道总数的情况下就能找到最后一个数。
二.单中括号[]和双中括号[[]]
(1)单中括号[]
1.[]用于条件测试,是一个命令,]用于关闭条件判断,这个命令把它的参数作为比较表达式或者文件参数,并且根据比较的结果来返回一个退出状态码。如果为真则退出码为0,为假则退出码为1。
[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不能用于整数比较。整数比较只能使用-gt(大于).-lt(小于).-eq(等于).-ge(大于等于).-le(小于等于)来进行比较。
当比较字符串时,注意给比较运算符两边加上相同的字符,这样的话,当输入为空的时候也可以进行比较。同时,[和]与中间的表达式必须有空格,比较运算符与表达式也最好加上空格。程序如下:
执行结果:
2.[]可用作正则表达式的一部分,描述一个匹配的字符范围;
3.在一个array结构的上下文中,[]用来引用数组中每个元素的编号。
(2)双中括号[[]]
1.[[]]不是命令,是关键字。[[]]比[]结构更加通用,在[[和]]之间的所有字符都不会发生文件名扩展或是单词分割,但是会发生参数扩展或是命令替换。
2.使用[[]]条件判断结构,能够防止脚本中的许多逻辑错误。比如,&&,||,<和>操作符能够正常存在于[[]]条件判断结构中([[]]中不支持">="和"<="),如果出现在[]中会报错(在[]中想要进行与,或的判断的时候,需要用到-a(与)和-o(或)来进行连接)。
程序如下:
执行结果: