# 4.3 Bash變量是弱類型的
不同于許多其他編程語言,Bash 并不區分變量的類型。本質上說,*Bash 變量是字符串*,但在某些情況下,Bash 允許對變量進行算術運算和比較。決定因素則是變量值是否只含有數字。
樣例 4-4. 整數還是字符串?
```bash
#!/bin/bash
# int-or-string.sh
a=2334 # 整數。
let "a += 1"
echo "a = $a " # a = 2335
echo # 依舊是整數。
b=${a/23/BB} # 將 "23" 替換為 "BB"。
# $b 變成了字符串。
echo "b = $b" # b = BB35
declare -i b # 將其聲明為整數并沒有什么卵用。
echo "b = $b" # b = BB35
let "b += 1" # BB35 + 1
echo "b = $b" # b = 1
echo # Bash 認為字符串的"整數值"為0。
c=BB34
echo "c = $c" # c = BB34
d=${c/BB/23} # 將 "BB" 替換為 "23"。
# $d 變為了一個整數。
echo "d = $d" # d = 2334
let "d += 1" # 2334 + 1
echo "d = $d" # d = 2335
echo
# 如果是空值會怎樣呢?
e='' # ...也可以是 e="" 或 e=
echo "e = $e" # e =
let "e += 1" # 空值是否允許進行算術運算?
echo "e = $e" # e = 1
echo # 空值變為了一個整數。
# 如果時未聲明的變量呢?
echo "f = $f" # f =
let "f += 1" # 是否允許進行算術運算?
echo "f = $f" # f = 1
echo # 未聲明變量變為了一個整數。
#
# 然而……
let "f /= $undecl_var" # 可以除以0么?
# let: f /= : syntax error: operand expected (error token is " ")
# 語法錯誤!在這里 $undecl_var 并沒有被設置為0!
#
# 但是,仍舊……
let "f /= 0"
# let: f /= 0: division by 0 (error token is "0")
# 預期之中。
# 在執行算術運算時,Bash 通常將其空值的整數值設為0。
# 但是不要做這種事情!
# 因為這可能會導致一些意外的后果。
# 結論:上面的結果都表明 Bash 中的變量是弱類型的。
exit $?
```
弱類型變量有利有弊。它可以使編程更加靈活、更加容易(給與你足夠的想象空間)。但它也同樣的容易造成一些小錯誤,容易養成粗心大意的編程習慣。
為了減輕腳本持續跟蹤變量類型的負擔,Bash *不允許*變量聲明。
- 第一部分 初見shell
- 1. 為什么使用shell編程
- 2. 和Sha-Bang(#!)一起出發
- 2.1 調用一個腳本
- 2.2 牛刀小試
- 第二部分 shell基礎
- 3. 特殊字符
- 4. 變量與參數
- 4.1 變量替換
- 4.2 變量賦值
- 4.3 Bash弱類型變量
- 4.4 特殊變量類型
- 5. 引用
- 5.1 引用變量
- 5.2 轉義
- 6. 退出與退出狀態
- 7. 測試
- 7.1 測試結構
- 7.2 文件測試操作
- 7.3 其他比較操作
- 7.4 嵌套 if/then 條件測試
- 7.5 牛刀小試
- 8. 運算符相關話題
- 8.1 運算符
- 8.2 數字常量
- 8.3 雙圓括號結構
- 8.4 運算符優先級
- 第三部分 shell進階
- 10. 變量處理
- 10.1 字符串處理
- 10.1.1 使用 awk 處理字符串
- 10.1.2 參考資料
- 10.2 參數替換
- 11. 循環與分支
- 11.1 循環
- 11.2 嵌套循環
- 11.3 循環控制
- 11.4 測試與分支
- 12. 命令替換
- 13. 算術擴展
- 14. 休息時間
- 第五部分 進階話題
- 19. 嵌入文檔
- 20. I/O 重定向
- 20.1 使用 exec
- 20.2 重定向代碼塊
- 20.3 應用程序
- 22. 限制模式的Shell
- 23. 進程替換
- 26. 列表結構
- 25. 別名