在做項目的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 命令的解釋是:
The test command can be used on the Linux command line to compare one element against another, but it is more commonly used in BASH shell scripts as part of conditional statements which control logic and program flow
接下來就簡單介紹一下這個神器的用法,比如下面這個基礎命令
test 1 -eq 2 && echo "yes" || echo "no"
上面這段命令的意思是 1 等於 2 嗎? 如果等於就輸出 yes 否則輸出 no 顯然答案是 no
具體解剖開來就是
- test 表示的你將要進行一個比較
- 1 是你第一個要比較的數據
- -eq 表示 equal 就是等於
- 2 是你第二個要比較的數據
- && 這個符號后的語句會在表達式為 true時執行
- || 這個符號后面的語句會在表達式為 false的時候執行
當比較的是數字時,還可以又以下其他符號:
- -eq 還有其他比較的符號
- -ge : 表示 大於等於
- -gt: great than 大於
- -le: less equal than 小於等於
- -lt: 小於
- -ne: 不等於
當比較的是 Text時
- = :表示的是 string 1 和 stirng2 匹配,相等
- != :和上面相反
- -n :表示這個字符串的長度大於 0
- -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 啊,趕緊去試試!