`
tomotoboy
  • 浏览: 162860 次
  • 性别: 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呢

相关推荐

    Java表达式计算引擎:Expr4J

    public class TestExpr4j { /** * @param args */ public static void main(String[] args) { SimpleEvaluationContext context = new SimpleEvaluationContext(); System.out.println("Expr ...

    开源项目-antonmedv-expr.zip

    开源项目-antonmedv-expr.zip,expr是一个业务规则引擎

    前端项目-expr-eval.zip

    前端项目-expr-eval,Mathematical expression evaluator

    编译原理实验(基于表达式的计算器ExprEval)

    相对新手而言,这个实验有较大难度。这里提供大家一个参考。但希望大家还是自己写,你会发现原来这么回事。不要把问题想得太复杂了。

    Linux expr命令用法详解

    Linux expr命令 expr命令是一个手工命令行计数器,...> expr length “this is a test” 14 2、抓取字串 > expr substr “this is a test” 3 5 is is 3、抓取第一个字符数字串出现的位置 > expr index sarasara a

    PHP100视频教程 5:PHP循环语句的介绍与应用.rar

    软件介绍 1、break n 循环控制语句 也可以理解为循环中断语句,跳出循环语句 2、do…while 循环语句 do{ …… } while(expr) 先执行一次循环再判断条件 while(expr){ …… } 先判断条件执再行一次循环 3...

    SQL2019-SSEI-Expr.exe

    SQL2019在线安装小工具;亲测可以安装

    SQLServer2016-SSEI-Expr.rar

    Microsoft SQL Server 2016是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理。

    expr命令 命令行计数器

    expr命令的英文全称是“expression”,即是表达式的意思,作用是一个命令行的计数器,常用于在UNIX/...[root@linuxcool ~]# expr length “this is a test” 14 抓取字串: [root@linuxcool ~]# expr substr “thi

    SQLServer2016-SSEI-Expr.exe

    SQLServer2016-SSEI-Expr是适用于Windows系统下的2016版,方便使用,请放心下载

    基于表达式的计算器ExprEval

    实现了四则运算+,-,*,/,max,min,sin,cos四个内值函数。 还有求负和求幂运算。 实现了三元运算符?: 实现了逻辑运算& ! ! 实现了比较运算符 > < >= 可以单独求布尔表达式的值。...编译原理作业

    Go-Expr是一个可以评估表达式的引擎

    该程序包的目的是允许用户在配置中使用表达式来处理更复杂的逻辑。 它是业务规则引擎基础的完美候选者。

    ExprEval.rar_ExprEval

    编译原理,实现科学计数器,支持加减乘除,布尔常量,科学计数法等

    expr-开源

    EXPR是用于记录和分析动物行为的软件包。 通过按下计算机上的特定键盘键来进行记录。 该软件然后保存行为的顺序和时间。 请注意DOS(1995:...

    expr10(1).zip

    expr10(1).zip

    expreval.zip_ExprEval_数学表达式

    数学表达式计算和解析 用c语言编写的,内含有例.速度较快

Global site tag (gtag.js) - Google Analytics