`
tomotoboy
  • 浏览: 167309 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

条件控制(test,expr……)

阅读更多
测试文件状态
test
test一般有两种格式,即:
test condition

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

/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

测试时使用逻辑操作符
测试文件状态是否为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

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

/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

测试数值
测试数值可以使用许多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可为:
-eq   数值相等。
-ne   数值不相等。
-gt   第一个数大于第二个数。
-lt   第一个数小于第二个数。
-le   第一个数小于等于第二个数。
-ge   第一个数大于等于第二个数。

/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


expr用法
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

增量计数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
数值测试
可以用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

模式匹配
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
这里没有搞懂,tomotoboy和nefu_luyanshen,明明存在而结果是0
分享到:
评论
1 楼 lahvey 2010-04-27  
因为你的$VALUE值是“sed.txt”,并不是这个文件的内容,所以怎么会存在tomotoboy和nefu_luyanshen呢

相关推荐

    orcale常用命令

    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

    最全的oracle常用命令大全.txt

    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

    jquery函数大全

    - `$(function(){……..});` 页面加载完成后执行匿名函数。 - `$(”div > p”).css(”border”, “1px solid gray”);` 为所有`div`的直接子`p`元素设置边框样式。 - `$.extend(prop)` 扩展jQuery对象,例如添加...

    JQuery用法大全

    - `$\(function(){……..});`: 在文档加载完成后执行的匿名函数,相当于 `$(document).ready()`. - `$(”div > p”).css(”border”, “1px solid gray”);`: 选择父元素下的子元素并设置 CSS 样式。 - `$(”...

    jquery常用的方法

    这对于实现条件样式非常有用。 9. **输入元素的值**: `$(”input 元素名称”).val()`用于获取`<input>`元素的值,`$(”input 元素名称”).val(value);`用于设置其值。 10. **元素操作**: - `$(”元素名称”)....

    jquery基础教程

    - **元素判断**: `is(expr)`,判断元素是否满足特定的条件。 - **相邻元素**: `next(expr)`,返回紧邻在当前元素后的兄弟元素。 - **排除元素**: `not(el)`、`not(expr)`或`not(elems)`,从集合中排除不匹配的元素。...

    Linux SHELL脚本

    本文将深入探讨Linux Shell脚本的基础知识,包括脚本的执行方式、变量使用、系统变量、特殊变量、获取用户输入、条件测试以及流程控制。 首先,Shell脚本的执行方式有三种: 1. 如果脚本的第一个非空字符不是`#`,...

    jQuery方法大全

    - `$(元素).next(expr)`,`$(元素).prev(expr)`,`$(元素).siblings(expr)`:找到元素的相邻兄弟元素。 6. 核心功能 - `$()`:用于选择DOM元素,可以是HTML字符串、DOM元素或jQuery对象。 - `$(function(){……....

    Jquery方法大全

    - **示例**:`$("img").attr("src","test.jpg")`将所有`<img>`元素的`src`属性设置为`test.jpg`。 **1.3 html** ```javascript $("元素名称").html(); $("元素名称").html("<b>newstuff</b>"); ``` - **功能**:...

    JQUERY事件大全

    - **`$(function(){……..});`** 页面加载完成时执行函数。例如:`$(document).ready(function() { console.log("Document is ready!"); });` 页面加载完成后打印消息。 - **`$("div>p").css("border","1px solid...

    整理后java开发全套达内学习笔记(含练习)

    abstract (关键字) 抽象 ['æbstrækt] access vt....输出格式控制: 转义符: \ddd 1到3位8进制数指定Unicode字符输出(ddd) \uxxxx 1到4位16进制数指定Unicode字符输出(xxxx) \\ \ \' ' \" ...

    net学习笔记及其他代码应用

    答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 47.当一个线程进入一个对象的一个synchronized方法...

    经典SQL语句大全

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a ...

    数据库操作语句大全(sql)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a...

Global site tag (gtag.js) - Google Analytics