在做项目的CI/ CD 时,难免会用到 Travis.CI 和 AppVeyor 以及 CodeCov 来判断测试的覆盖率,今天突然遇到了一个问题,就是我需要在每次做测试的时候判断是否存在一个环境变量,我对于 script 脚本半只半解还不太懂的状态,我最初的打算是这样写的

if [-z $ENV_VALUE && -z $ENV_VALUE]; then
    #do something
else
    #do another
fi

没想到,在windows上跑着正常的,编写到 .yml 文件的 script 中时,在 GitHub 上就报错了,说-z was unexcepted at this time. 看的我真的是一脸懵啊,什么鬼。去Google 了一下,也没有找到什么可靠的答案,于是我去翻了翻其他语言的项目中是如何写 .yml 文件的,刚开始其实我也去看了看,只记得里面有个这个命令 test -z $ENV_VALUE -a -z $ENV_VALUE 。开始没有太注意,后来发现这个 test 命令我在写脚本时怎么从来没见过呢,去Google 了一下,发现新大陆。

这个 Test 命令的解释是:

接下来就简单介绍一下这个神器的用法,比如下面这个基础命令

test 1 -eq 2 && echo "yes" || echo "no"

上面这段命令的意思是 1 等于 2 吗? 如果等于就输出 yes 否则输出 no 显然答案是 no
Yaml 文件中Condition If- else 判断的问题-LMLPHP

具体解剖开来就是

  1. test 表示的你将要进行一个比较
  2. 1 是你第一个要比较的数据
  3. -eq 表示 equal 就是等于
  4. 2 是你第二个要比较的数据
  5. && 这个符号后的语句会在表达式为 true时执行
  6. || 这个符号后面的语句会在表达式为 false的时候执行

当比较的是数字时,还可以又以下其他符号:

  1. -eq 还有其他比较的符号
  2. -ge : 表示 大于等于
  3. -gt: great than 大于
  4. -le: less equal than 小于等于
  5. -lt: 小于
  6. -ne: 不等于

当比较的是 Text时

  1. = :表示的是 string 1 和 stirng2 匹配,相等
  2. != :和上面相反
  3. -n :表示这个字符串的长度大于 0
  4. -z: 表示这个字符串长度等于 0

当比较 string 类型或者是 file 文件都有相应的符号来进行比较,对于要在 bash 上脚本中进行比较很是方便。
对于我之前想要在 .yml 文件中进行比较判断的语句,则可以写成以下这个样了:


test -z $ENV_VALUE1 -a -z $ENV_VALUE2 && dotnet test --filter Category = category1 || dotnet test --filter Category = all

# -a 代表的是 and

是不是 So easy 啊,赶紧去试试!

参考文章:
How to Use Test Conditions Within a Bash Script

02-26 05:31