awk 型別動態自適應,但隱性轉換常導致邏輯錯誤。掌握顯式轉換與連接規則,能寫出更穩健的程式。
awk 'BEGIN{a="100"; b="10test10"; print a+b+0}' # 110
+0 或參與任何算術運算 (+ - * / %) 即觸發轉換"10test") → 讀取前導數字 (10),遇非數字停止"test") → 0awk 'BEGIN{a=100; b=100; c=a""b; print c}' # 100100
數字 "" 數字 或 數字 "" 字串 產生字串連接sprintf("%d", num) 格式化轉字串 (可控制進位、補零)awk 'BEGIN{a="a"; b="b"; print a b}' # ab (空字串連接)
awk 'BEGIN{a="a"; b="b"; print a" "b}' # a b (含空格)
awk 'BEGIN{a="a"; b="b"; print a+b}' # 0 (算術運算,字串轉 0)
| 運算子 | 行為 | 結果型別 |
|---|---|---|
"" (空字串) | 字串連接 | 字串 |
空格 | 字串連接 (語法糖) | 字串 |
+ | 算術加法 (強制轉數字) | 數字 |
function to_int(str) { return (str ~ /^[0-9]+$/) ? str+0 : 0 }
function to_float(str) { return (str ~ /^[0-9.]+$/) ? str+0 : 0.0 }
awk 'BEGIN{pi=3.1415926; print sprintf("%.2f", pi)}' # 3.14
awk 'BEGIN{num=42; print sprintf("%05d", num)}' # 00042
awk 'BEGIN{a="100"; b="200"; print a>b}' # 字串比較:"100" > "200" → true (1)
awk 'BEGIN{a=100; b=200; print a>b}' # 數字比較:100 > 200 → false (0)
鐵律:比較運算子 (> < >= <= == !=) 若雙操作數皆為數字則數值比較,否則字串比較 (ASCII 碼序)。必要時用 +0 強制轉型。