shell指令碼變數字串拼接的乙個坑

2021-10-13 07:29:20 字數 1363 閱讀 4148

背景

問題發生在jenkins持續整合的打包指令碼上,我們需要將資料庫指令碼按照不同條件抽取出來,放到不同的資料夾下。

問題分析

要實現這個需求,其中自然少不了條件判斷,其中有一段**:

if

[-d "$temppath/$version/$version_standard"

]; then

它的邏輯是,如果存在標準(standard)的指令碼目錄,則需要做一段邏輯。你能看出這個語句有什麼問題嗎?

是的,它的字串拼接的方式錯了,就是這句$version_standard。它本來的含義是在變數$version後面拼接乙個字串,如v1.0.0_standard,而寫成$version_standard意味著要找名稱為version_standard的變數,結果是為空的。

我們通過linux黑視窗來測試一下:

我們可以看到$version_standard輸出的結果是空的,並沒有得到v1.0.0_standard的結果,而採用$_standard的形式,得到了我們想要的結果。

這段錯誤**導致的結果是,不論是否存在$_standard資料夾,只要存在上一級資料夾$temppath/$version,if裡面的判斷就為真,這就產生了錯誤的結果

總結一下字串拼接常用方案

就以上面說的$version變數與_standard字串拼接的例子說明。

1、採用$_standard的形式,通過{}限定變數的範圍。

2、採用$version"_standard"的形式,通過「」限定字串的範圍。

3、採用$version$type的形式,定義乙個type變數,值為_standard,將兩個變數連線,兩個變數之間不要有空格。

4、融會貫通之後,當然,你也可以採用$version"_"$type進行字串拼接了,自由組合。

你學會了嗎?

shell 字串拼接

bin bash name shell url str1 name url 中間不能有空格 str2 name url 如果被雙引號包圍,那麼中間可以有空格 str3 name url 中間可以出現別的字串 str4 name url 這樣寫也可以 str5 script index.html 這個...

shell 字串拼接

bin bash name shell url str1 name url 中間不能有空格 是因為當字串不被任何一種引號包圍時,遇到空格就認為字串結束了,空格後邊的內容會作為其他變數或者命令解析 str2 name url 如果被雙引號包圍,那麼中間可以有空格 str3 name url 中間可以出...

sql server 變數 字串拼接

參考 sql server中null 字串,isnull以及把查詢結果賦給乙個字元變數組成另乙個查詢語句 1.開始定義的字串都為null.例如 declare sql,那麼 sql就是null 如果後面要進行 變數字串的變數拼接的話,最好是給 sql先賦值為空 或者 其他變數 需求 在乙個游標內 迴...