踩踩Linux命令中的那些坑

有时候面对命令的执行和条件的判断,可能会遇到莫名奇妙的原因,可能是人为错误导致,也可能是命令本身的问题。

expr的坑

expr 是用来对数值进行计算的命令,命令的前后参数需要用空格隔开

[root@localhost ~]# whatis expr
expr (1) – evaluate expressions    表达式求值

expr命令被用做表达式求职计算,但是 expr计算的结果为0的时候,将会被认为是错误的,不能作为条件判断的依据

例如:

[root@localhost ~]# expr 1 + 2

3

expr还可以对变量的值进行计算

[root@localhost ~]# n=3;expr $n + 2

5

但命令执行后是否成功呢??

$? 是shell中显示命令执行结果是否正确的内置变量,如果执行结果的值为0,表示命令正确执行

使用一个未定义的变量试试

[root@localhost ~]# expr $x + 2;echo $?

2

0

坑!

#结果是对的

[root@localhost ~]# expr $y + 0

0

#被判定为命令执行失败

[root@localhost ~]# echo $?

1

[root@localhost ~]# y=10;expr $y + 0

10

[root@localhost ~]# echo $?

0

原因

expr的执行结果如果是0,将会被 $? 认为命令执行失败。expr不能轻易用于作为条件判断,有时候不能当做条件判断的依据

在expr命令的帮助文档中有一句描述:Exit  status  is  0  if  EXPRESSION  is  neither null nor 0, 1 if EXPRESSION is null or 0, 2 if EXPRESSION is syntactically invalid, and 3 if an error occurred.

也就是说,如果表达式的执行结果为null或者0,就认为执行的最终结果为1[命令执行失败],否则为0[命令执行成功]

类似的情况

let的坑

[root@localhost ~]# i=0;let i++;echo $?

1

[root@localhost ~]# i=0;let ++i;echo $?

0

[root@localhost ~]# let m=0;echo $?

1

查一下let的帮助

help let

和expr类似的情况

Exit Status:If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

[root@localhost ~]# i=10;j=-10;

[root@localhost ~]# let sum=i+j

执行结果是对的,但被判定为执行命令失败

[root@localhost ~]# echo $sum

0

[root@localhost ~]# echo $?

1

 

例如想计算出两个数的值就输出,则会出现不能成功输出计算得出值得情况,就是因为前一条命令被判定为执行失败,使用短路与的命令,后续不执行导致的,所以,只能把一条命令拆成2条命令去写

[root@localhost ~]# let sum=i+j && echo $sum

[root@localhost ~]# let sum=i+j ;echo $sum

0

用于条件判断的命令如果不严谨,将会导致一些无法预料的事情发生!

 

在做变量测试时候遇到的另一个坑

test命令

  • 长格式的例子:

test “$A” == “$B” && echo “Strings are equal”

test “$A” -eq “$B” && echo “Integers are equal”

  • 简写格式的例子:

[ “$A” ==  “$B” ] && echo “Strings are equal”

[ “$A” -eq “$B” ] && echo “Integers are equal”

[root@localhost ~]# whatis test

test (1)             – check file types and compare values        检查文件类型和值进行比较

[root@localhost ~]# help test

test: test [expr]

Evaluate conditional expression.

其中有一个参数

-n STRING
STRING True if string is not empty.        如果字符串不为空表示为真

 

test的坑

测试成功返回0.测试失败返回255以内的数

[$name 是一个不存在的变量]

[root@localhost ~]# [ -n $name ]            为空的变量测试为真???what??

[root@localhost ~]# echo $?

0           竟然 测试成功

[root@localhost ~]# echo $name            $name没有值

 

[root@localhost ~]# name=wang            给$name 赋值

[root@localhost ~]# [ -n $name ]            测试[如果变量不为空则为true]

[root@localhost ~]# echo $?

0            OK,没问题

[root@localhost ~]# unset name            删除$name变量,此时$name的值为空,测试时应该表现为假才对

[root@localhost ~]# [ -n $name ]            ???不对了

[root@localhost ~]# echo $?

0            删除变量$name后,此时测试应该表现为失败,返回其他数字

[root@localhost ~]# test -n $name;echo $?

0

[root@localhost ~]# [[ -n $name ]]

[root@localhost ~]# echo $?

1

[root@localhost ~]# echo $name

#由于之前已经删掉了$name变量的值,所以已经为空,不为空表示为真,为空表现为假,所以一下的测试都是失败的

[root@localhost ~]# [ -n “$name” ]            加上双引号进行测试

[root@localhost ~]# echo $?

1           由于已经unset掉了$name,所以测试的语句的返回值是其他数,这里是对的

[root@localhost ~]# test -n “$name”            加上引号测试变量

[root@localhost ~]# echo $?

1            由于已经unset掉了$name,所以测试的语句的返回值是其他数,这里是对的

 

不加引号,判断出来全是真,这是一个坑!坑!坑!

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88818

(0)
无言胜千言无言胜千言
上一篇 2017-11-22
下一篇 2017-11-23

相关推荐

  • 毕业即高薪只是别人家的好事吗?

    1 毕业即高薪?运气?梦想?还是嘘头?  同学们,你还在担心毕业后不好找工作吗,毕业即高薪只是别人家的好事吗?马哥linux又一名在校生学员毕业即20w+高薪名企,你还在等什么呢? 真的只是梦想么?还是只存在于别人家的公司? 越来越多的在校大学生凭着强烈的上进心踊跃的加入了马哥linux的学习阵营,这名研究生同学在研究生毕业的同时也从马哥linux…

    2015-09-06
  • N24期linux之学习宣言

        学习linux时间已经过去了一周之余,每天下班后拖着疲惫的身体回家。虽然很累,但也觉得这次选择很值得,但愿以后自己发展的会越来越好!     我的学习宣言是:     刻苦学习,努力超越自己。     明天的我一定会感谢今天努力的自己!     努力 …

    Linux干货 2016-10-29
  • grep的用法

    grep的用法 1、复制/etc/skel目录为/home/tuser1及其内容文件的属组和其它用户均没有任何访问权限。 cp -R /etc/skel /home/thuser1 #复制文件/etc/skel 到/home/目录下并改名为thuser1 chmod -R 700 /home/thuser1 #更改/home/thuser1目录权限为属主全部…

    Linux干货 2017-07-23
  • Linux文件管理命令详解–cp,mv,rm

    在Linux系统里平时需要对目录文件做一些管理操作,其中最基本的有cp,mv,rm等命令: cp命令:copy 复制   其中包含源文件,目标文件: copy分为单源复制和多源复制,详解如下:               单源复制:cp [option]…[-T] S…

    Linux干货 2016-11-06
  • 数据库简介和简单操作

    数据库 数据库是数据的汇集,它以一定的形式存储在存储介质上 数据库的发展史 萌芽阶段:文件系统,使用磁盘文件来存储数据 初级阶段:第一代数据库,出现了网状模型、层次模型的数据库 中级阶段:第二代数据库,关系型数据库和结构化查询语言 高级阶段:新一代数据库,“关系-对象”型数据库 数据库管理系统和文件管理系统 文件管理系统的缺点是: 编写应用程序不方便 数据冗…

    2017-12-04
  • linux系统文件的元数据

    linux系统文件的元数据 什么是元数据 文件的数据分两种: 一种元数据,既属性数据:metadata 一种就是数据本身:data 如何查看元数据: stat stat命令用于显示文件的状态信息 [root@localhost ~]# stat /tmp/mylinux File: ‘/tmp/mylinux’ Size: 143 Blocks: 0 IO …

    Linux干货 2018-03-11