条件控制(test,expr……)

[b]测试文件状态[/b]
test
test一般有两种格式,即:
test condition

[ condition ]
使用方括号时,要注意在条件两边加上空格。测试文件状态的条件表达式很多,但是最常用的可在下表中查到。
[table]
|-d| 目录 |-s |文件长度大于0、非空|
|-f| 正规文件 |-w |可写|
|-L| 符号连接 |-u |文件有suid位设置|
|-r| 可读 |-x |可执行|
[/table]
/home/l/g/tomotoboy >test -d sed.out
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >test -f sed.out
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ -f sed.out ]
/home/l/g/tomotoboy >echo $?
0
/home/l/g/tomotoboy >[ -d sed.out ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ -x sed.out ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ -r sed.out ]
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ -w sed.out ]
/home/l/g/tomotoboy >echo $?
0

[b]测试时使用逻辑操作符[/b]
测试文件状态是否为OK,但是有时要比较两个文件状态。shell提供三种逻辑操作完成此功能。
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面比较两个文件sed.out、sed.txt:
/home/l/g/tomotoboy >ls -al sed.out sed.txt
-rw-r--r-- 1 tomotoboy member 159 Jul 30 16:47 sed.out
-rw-r--r-- 1 tomotoboy member 655 Jul 31 14:44 sed.txt
/home/l/g/tomotoboy >[ -w sed.out -a -w sed.txt ]
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt]
-bash: [: missing `]'
/home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ -x sed.out -o -r sed.txt ]
/home/l/g/tomotoboy >echo $?
0

[b]字符串测试[/b]
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。字符串测试有5种格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator "string" ]
[ "string" string_operator "string" ]
这里,string_operator可为:
[table]
|= |两个字符串相等。|
|!= |两个字符串不等。|
|-z |空串。|
|-n |非空串。|
[/table]
/home/l/g/tomotoboy >[ -z $HELLO ]
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >HELLO="hello"
/home/l/g/tomotoboy >[ -z $HELLO ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ -n $HELLO ]
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ !-n $HELLO ]
[ nohup -p 1 $HELLO ]
-bash: [: too many arguments
/home/l/g/tomotoboy >[ ![ -n $HELLO ] ]
[ [ -z $HELLO ] -n $HELLO ] ]
-bash: [: too many arguments
/home/l/g/tomotoboy >HI="hi"
/home/l/g/tomotoboy >[ $HELLO = $HI]
-bash: [: missing `]'
/home/l/g/tomotoboy >[ $HELLO = $HI ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ $HELLO != $HI ]
/home/l/g/tomotoboy >echo $?
0

[b]测试数值[/b]
测试数值可以使用许多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可为:
[table]
|-eq |数值相等。|
|-ne |数值不相等。|
|-gt |第一个数大于第二个数。|
|-lt |第一个数小于第二个数。|
|-le |第一个数小于等于第二个数。|
|-ge |第一个数大于等于第二个数。|
[/table]
/home/l/g/tomotoboy >Nbr=10
/home/l/g/tomotoboy >Nbr1=20
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >Nbr -ne Nbr1
-bash: Nbr: command not found
/home/l/g/tomotoboy >$Nbr -ne $Nbr1
-bash: 10: command not found
/home/l/g/tomotoboy >[ "$Nbr" -ne "$Nbr1" ]
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ "$Nbr" -e "$Nbr1" ]
-bash: [: -e: binary operator expected
/home/l/g/tomotoboy >[ "$Nbr" -eq "$Nbr1" ]
/home/l/g/tomotoboy >echo $?
1
/home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]
/home/l/g/tomotoboy >echo 4?
4?
/home/l/g/tomotoboy >echo $?
0

/home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]
/home/l/g/tomotoboy >echo $?
1

/home/l/g/tomotoboy >[ "$Nbr" -lt "$Nbr1" ]
/home/l/g/tomotoboy >echo $?
0

可以不必将整数值放入变量,直接用数字比较即可,但要加引号。
/home/l/g/tomotoboy >[ "99" -ge "60" ]
/home/l/g/tomotoboy >echo $?
0


[b]expr用法[/b]
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
/home/l/g/tomotoboy >expr 10 + 10
20

/home/l/g/tomotoboy >expr 45 / 4
11

使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义
/home/l/g/tomotoboy >expr 30 \* 100
3000

[b]增量计数[/b]expr在循环中用于增量计算。首先,循环初始化为 0,然后循环值加1,反引号的用法意即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量
/home/l/g/tomotoboy >loop=0
/home/l/g/tomotoboy >loop=`expr $loop + 1`
/home/l/g/tomotoboy >echo

/home/l/g/tomotoboy >echo $?
0
/home/l/g/tomotoboy >echo $loop
1
[b]数值测试[/b]
可以用expr测试一个数。如果试图计算非整数,将返回错误。
/
home/l/g/tomotoboy >f=1.1
/home/l/g/tomotoboy >expr f + 10
expr: non-numeric argument
/home/l/g/tomotoboy >echo $?
2

/home/l/g/tomotoboy >expr $HELLO + 10
expr: non-numeric argument
/home/l/g/tomotoboy >echo $?
2

/home/l/g/tomotoboy >expr "$HELLO" + 10
expr: non-numeric argument
/home/l/g/tomotoboy >echo $?
2

/home/l/g/tomotoboy >expr $f + 10
expr: non-numeric argument

expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为“hello”和“hello” 。

/home/l/g/tomotoboy >expr $HELLO = "hello"
1
/home/l/g/tomotoboy >echo $?
0

[b]模式匹配[/b]
expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次.
/home/l/g/tomotoboy >cat sed.txt
605408211 pts/16 Jul 31 13:54 (218.0.1.42)
caodejun pts/44 Jul 31 14:16 (219.148.133.31)
duke1988 pts/45 Jul 31 14:41 (218.104.163.66)
liuzk423 pts/6 Jul 20 08:27 (219.245.104.240)
nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142)
nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142)
shuzigui pts/21 Jul 31 12:11 (121.35.248.193)
tomotoboy pts/41 Jul 31 13:31 (219.221.99.155)
waterlooz pts/25 Jul 31 08:48 (121.0.29.225)
wsoangel pts/35 Jul 31 13:40 (116.233.219.10)
xp55699312 pts/42 Jul 31 14:12 (61.152.132.103)
zyy0904 pts/43 Jul 31 13:53 (125.33.195.36)

/home/l/g/tomotoboy >VALUE=sed.txt
/home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'
expr: syntax error
/home/l/g/tomotoboy >expr $VALUE : tomotoboy
0

/home/l/g/tomotoboy >
/home/l/g/tomotoboy >expr $VALUE:tomotoboy
sed.txt:tomotoboy
/home/l/g/tomotoboy >expr $VALUE: tomotoboy
expr: syntax error
/home/l/g/tomotoboy >expr $VALUE : tomotoboy
0
/home/l/g/tomotoboy >expr $VALUE :tomotoboy
expr: syntax error
/home/l/g/tomotoboy >expr $VALUE : tomotoboy
0
/home/l/g/tomotoboy >expr $VALUE : tomotoboy, '.*'
expr: syntax error
/home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'
expr: syntax error

/home/l/g/tomotoboy >expr $VALUE : '.*'
7

/home/l/g/tomotoboy >expr $VALUE : tomotoboy
0

/home/l/g/tomotoboy >expr $VALUE : "tomotoboy"
0

/home/l/g/tomotoboy >expr $VALUE : "nefu_luyanshen"
0
[color=red]这里没有搞懂,tomotoboy和nefu_luyanshen,明明存在而结果是0[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值