自己抄书用于记忆的,可能会加点自己写的东西
17.1 测试文件状态
Test命令用于测试字符串、文件状态和数字
test一般有两种格式
test condition
或
[ condition ]
#使用方括号时,要注意在条件两边加上空格
-d | 目录 |
-f | 正规文件 |
-L | 符号连接 |
-r | 可读 |
-s | 文件长度大于0、非空 |
-w | 可写 |
-u | 文件有suid位设置 |
-x | 可执行 |
#使用两种方法测试文件scores.txt是否可写并用最后退出状态测试是否成功。
#记住,0表示成功,其他为失败
#!/bin/bash
$ ls -l scores.txt
#1、
$ [ -w scores.txt ]
$ echo $?
#2、
$ test -w scores.txt
$ echo $?
#3、测试是否存在appsbin目录
$ [ -d appsbin ]
$ echo $?
#4、测试文件权限是否设置了suid位
$ [ -u xab ]
$ echo $?
17.2 逻辑操作符
测试文件状态是否为OK,但是有时要比较两个文件状态
shell提供三种逻辑操作完成此功能
-a 逻辑与,操作符两边均为真,结果为真,否则为假
-o 逻辑或,操作符两边一边为真,结果为真,否则为假
! 逻辑否,条件为假,结果为真
#下面的例子测试两个文件是否均为可读
$ [ -w results.txt -a -w scores.txt ]
$ echo $?
#测试其中一个是否可执行,使用逻辑或操作
$ [ -x results.txt -o -x scores.txt ]
$ echo $?
#要测试文件results.txt是否可写、可执行
$ [ -w results.txt -a -x results.txt ]
$ echo $?
17.3 字符串测试
字符串测试有5种格式
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator string ]
[ string string_operator string ]
这里string_operator可为
= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
#1、测试环境变量EDITOR是否为空
$ [ -z $EDITOR ]
$ echo $?
#2、非空,取值是否是vi
$ [ $EDITOR = "vi" ]
$ echo $?
#3、用echo命令反馈其值
$ echo $EDITOR
#4、测试变量tape和tape2是否相等
$ TAPE="/dev/rmt0"
$ TAPE2="/dev/rmt1"
$ [ "$TAPE" = "$TAPE2"]
$ echo $?
#没有规定在设置变量时一定要用双引号,但在进行字符串比较时必须这样做
17.4 测试数值
测试数值可以使用许多操作符
"number" numeric_operator "number"
或
[ "number" numeric_operator "number" ]
numeric_operator可为
-eq 数值相等 (equal)
-ne 数值不相等 (not equal)
-gt 第一个数大于第二个数 (greater than)
-lt 第一个数小于第二个数 (less than)
-le 第一个数小于等于第二个数 (less than or equal)
-ge 第一个数大于等于第二个数 (greater than or equal)
#测试两个数是否相等
$ NUMBER=130
$ [ "$NUMBER" -eq "130"]
$ echo $?
$ [ "$NUMBER" -eq "100"]
$ echo $?
$ [ "$NUMBER" -gt "100"]
$ echo $?
#也可以测试两个整数变量
$ SOURCE_COUNT=13
$ DEST_COUNT=15
$ [ "SOURCE_COUNT" -gt "DEST_COUNT" ]
$ echo $?
#可以不必将整数值放入变量,直接用数字比较即可,但要加引号
$ [ "990" -gt "995" ]
$ echo $?
#可以用逻辑操作符将两个测试表达式结合起来
#仅需要用到一对方括号,而不能用两个
$ [ "990" -le "995" -a "123" -gt "33"]
$ echo $?
17.5 expr用法
#expr命令一般用于整数值,但也可用于字符串
expr argument operator argument
#expr也是一个手工命令行技术器
$ expr 10 + 10
$ expr 900 + 600
$ expr 30 / 3
$ expr 30 / 3 / 2
#使用乘号时,必须用反斜线屏蔽其特定含义,因为shell可能会误解显示星号的意义
$expr 30 \* 3
17.5.1 增量计数
#expr在循环中用于增量计算
#循环初始化为0,然后循环值加1,反引号的用法意即替代命令
#最基本的一种是从(expr)命令接受输出并将之放入循环变量
$ LOOP=0
$ LOOP='expr $LOOP + 1'
17.5.2 数值测试
#可以用expr测试一个数。如果试图计算非整数,将返回错误
$ expr rr+1
expr: non-numeric argument
#这里需要将一个值赋予变量(不管其内容如何),进行数值运算,并将输出导入dev/null,然后测试最后命令状态,如果为0,证明这是一个数,其他则表明为非数值
$ VALUE=12
$ expr $VALUE + 10 > /dev/null 2>&1
$ echo $?
#expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成功返回1,任何其他值为无效或错误
#下面的例子测试两个字符是否相等
$ VALUE=hello
$ expr $VALUE = "hello"
1
$ echo $?
0
#expr成功返回1。
17.5.3 模式匹配
#expr也有模式匹配功能
#可以使用expr通过指定冒号选项计算字符串中字符数
#.*意即任何字符重复0次或多次
$ VALUE=accounts.doc
$ expr $VALUE : October 8, '.*'
#在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件附属名
$ expr $VALUE : '\(.*\).doc'
accounts