《shell腳本學習指南》6.1.3節描述了shell的算術展開,其支持的運算與C語言差很少,語法
$((...))
shell
$ echo $(( 3 * 4 )) 12
在某些場景特別方便,能夠免去寫程序的煩瑣,如驗證某些運算。
下面是驗證《深刻理解計算系統》練習題2.12的場景
表達式 ~0 將生成一個全1的掩碼,無論機器的字大小是多少,可移植。
bash
$ printf "%x\n" $(( ~0 )) ffffffffffffffff $ printf "%#x\n" $(( ~0 )) 0xffffffffffffffff
$ printf "%#x\n" $(( 0x89ABCDEF & 0xFF )) 0xef $ printf "%#.8x\n" $(( 0x89ABCDEF & 0xFF )) 0x000000ef
$ printf "%#.8x\n" $(( 0x87654321 & 0xFF )) 0x00000021 $ printf "%#.8x\n" $(( 0x87654321 & ?0xFF )) -bash: 0x87654321 & ?0xFF : syntax error: operand expected (error token is "?0xFF ")書中給出的練習題的答案是 「x & ?0xFF」,這裏的"?"號經驗證,shell沒法正確運行。
$ printf "%#x" $(( 0x87654321 ^ ~0xff)) 0xffffffff789abc21
C.x的最低有效字節設置成全1,其餘字節都保持不變。ide
$ printf "%#x" $(( 0x87654321 | 0xff )) 0x876543ff