Shell、Awk 中自動隱式類型轉換的“坑”

來源:互聯網
上載者:User

標籤:

1、問題:

在林林總總的程式設計語言裡,弱類型的語言著實不少,一方面這種“動態類型”用起來很方便,而另一方面則“坑”你沒商量~ 常見的 SQL、Shell、Awk 都會遇到各種暗藏的“隱式類型轉換”,下面就列舉一些 shell、awk 裡的自動隱式類型轉換 case,防止掉坑。

  • 注意 shell、awk 的變數為空 字串、變數為空 未定義初始值的隱式轉換問題:
# shell 下的字典排序比較[email protected] 10:59:23 /opt/script >[[ (( a > 0 )) ]] && echo 1  1[email protected] 10:59:34 /opt/script >[[ (( 00 > 0 )) ]] && echo 1  1# 雙括弧不做算術比較,而是字串的字典比較,等同於 [[]][[ (( 0 == 0 )) ]] && echo 1   1[email protected] 13:04:27 /opt/script >[[ (( 11 > 110 )) ]] && echo 1   [email protected] 13:04:34 /opt/script ># shell 的字串比較不做轉換,嚴格按照字面量字典比較[email protected] 11:51:41 /opt/script >[[ a == "" ]] && echo 1[email protected] 14:00:53 /opt/script >[[ a > "" ]] && echo 1 1[email protected] 14:00:59 /opt/script >[[ a > 0 ]] && echo 1  1# shell 的數字類型隱式轉換:變數未定義會被轉換為 0[email protected] 11:53:56 /opt/script >[[ a -eq 0 ]] && echo 1    1[email protected] 11:54:11 /opt/script >[[ a1 -eq 1 ]] && echo 1 [email protected] 11:55:11 /opt/script >[[ 1a -eq 1 ]] && echo 1 -bash: [[: 1a: value too great for base (error token is "1a")# awk 隱式類型只轉換 1a,不轉換 a1[email protected] 11:55:15 /opt/script >echo|awk ‘{print 1a == 1 }‘1# awk 外置變數未定義會被置為空白字串,且Null 字元串不會隱式轉換為數字[email protected] 14:12:57 /opt/script >echo|awk -va= ‘{print a == 0 }‘ 0[email protected] 14:18:08 /opt/script >echo|awk ‘{print "" == 0 }‘ 0[email protected] 14:13:01 /opt/script >echo|awk -va= ‘{print a == "" }‘1# awk 內建變數未定義預設會隱式轉換為數字 0 或者Null 字元串[email protected] 14:13:12 /opt/script >echo|awk ‘{print a == 0 }‘      1[email protected] 14:13:48 /opt/script >echo|awk ‘{print a == "" }‘1# awk 內建變數在比較時,一方加了雙引號,則最終結果當做字串比較(未定義的變數還是會自動隱式轉換)[email protected] 14:23:43 /opt/script >echo|awk ‘{print 0b == "00" }‘ 0[email protected] 14:23:47 /opt/script >echo|awk ‘{print 0b == 00 }‘   1[email protected] 14:36:57 /opt/script >echo|awk ‘{print "00" == 0 }‘ # 明確標識字串的不再隱式轉換為數字0# awk 中的隱式轉換:無論最終結果是否以數字比較,未定義的變數都會自動隱式轉換[email protected] 14:27:49 /opt/script >echo|awk ‘{print 0b == "0" }‘ 1echo|awk ‘{y=0b; print y == "0" }‘     1echo|awk ‘{print 0b == 0 }‘  1echo|awk ‘{y="0b"; print y == "0" }‘ 0echo|awk ‘{y="0b"; print +y == "0" }‘ 1[email protected] 23:49:55 ~ >echo|awk ‘{y="0b"; print +y == "00" }‘0[email protected] 23:49:59 ~ >echo|awk ‘{y="0b"; print (+y > "00") }‘0[email protected] 23:50:14 ~ >echo|awk ‘{y="0b"; print +y < "00" }‘1[email protected] 14:41:16 /opt/script >echo|awk ‘{print "00"a == "00" }‘ 1# awk 的外置變數參與比較時,與內建變數的隱式轉換特性不同,如果數字中含有非數字字串則直接被當做字串。# 也就是說 awk 外置變數不具有內建變數對 非數字字元隱式轉換 的特性[email protected] 16:16:27 /opt/script >a=0b; echo|awk -vm="$a" ‘{print m; print m == 0; print int(m) == 0 }‘0b01[email protected] 16:16:39 /opt/script >a=00; echo|awk -vm="$a" ‘{print m; print m == 0; print int(m) == 0 }‘  0011[email protected] 16:16:59 /opt/script >a=00; echo|awk -vm="$a" ‘{print m; print m == "0"; print int(m) == "0" }‘0001[email protected] 16:20:11 /opt/script >a=00; echo|awk -vm="$a" ‘{print m; print m == "00"; print int(m) == 0 }‘  0011[email protected] 00:33:24 ~ >a=0b; echo|awk -vm="$a" ‘{b=0;print 0b; print 0b == 0; print int(m) == 0 }‘0001# 為避免上述 case 的各種歧義和不確定性,還是老老實實的用 +、int 強制轉換吧~[email protected] 00:43:55 ~ >echo|awk ‘{print int("1/*")}‘1[email protected] 00:47:31 ~ >echo|awk ‘{print int("*/1")}‘0[email protected] 00:47:38 ~ >echo|awk ‘{print +"*/1"}‘0[email protected] 00:47:47 ~ >echo|awk ‘{print +"1/*"}‘1[email protected] 00:47:53 ~ >
2、結論: (1)shell 的自動隱式類型轉換相當弱,而 awk 相對而言容錯性好
(2)從 case 來看,如果單純的靠 shell、awk 的自動隱式類型轉換相當不靠譜,極其容易出錯,
(3) 為獲得確定的結果,還是老老實實的強制轉換吧,比如 awk 中使用 +、int 等。

Shell、Awk 中自動隱式類型轉換的“坑”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.