# 雙圓括號結構
與`let`命令類似,`(( ... ))` 結構允許對算術表達式的擴展和求值。它是`let`命令的簡化形式。例如,a=$(( 5 + 3 )) 會將變量a賦值成 5 + 3,也就是8。在Bash中,雙圓括號結構也允許以C風格的方式操作變量。例如,(( var++ ))。
**樣例 8-5. 以C風格的方式操作變量**
```
#!/bin/bash
# c-vars.sh
# 以C風格的方式操作變量,使用(( ... ))結構
echo
(( a = 23 )) # C風格的變量賦值,注意"="等號前后都有空格
echo "a (initial value) = $a" # 23
(( a++ )) # 后綴自增'a',C-style.
echo "a (after a++) = $a" # 24
(( a-- )) # 后綴自減'a', C-style.
echo "a (after a--) = $a" # 23
(( ++a )) # 前綴自增'a', C-style.
echo "a (after ++a) = $a" # 24
(( --a )) # 前綴自減'a', C-style.
echo "a (after --a) = $a" # 23
echo
########################################################
# 注意,C風格的++,--運算符,前綴形式與后綴形式有不同的
#+ 副作用。
n=1; let --n && echo "True" || echo "False" # False
n=1; let n-- && echo "True" || echo "False" # True
# 感謝 Jeroen Domburg。
########################################################
echo
(( t = a<45?7:11 )) # C風格三目運算符。
# ^ ^ ^
echo "If a < 45, then t = 7, else t = 11." # a = 23
echo "t = $t " # t = 7
echo
# -----------
# 復活節彩蛋!
# -----------
# Chet Ramey 偷偷往Bash里加入了C風格的語句結構,
# 還沒寫文檔說明 (實際上很多是從ksh中繼承過來的)。
# 在Bash 文檔中,Ramey把 (( ... ))結構稱為shell 算術運算,
# 但是這種表述并不準確...
# 抱歉啊,Chet,把你的秘密抖出來了。
# 參看 "for" 和 "while" 循環章節關于 (( ... )) 結構的部分。
# (( ... )) 結構在Bash 2.04版本之后才能正常工作。
exit
```
還可以參看 **樣例 11-13** 與 **樣例 8-4**。
- 第一部分 初見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. 別名