双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。
注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。后续讲到的 bc 命令可以用于小数运算。
Shell (( )) 的用法
双小括号 (( )) 的语法格式为:
((表达式))
通俗地讲,就是将数学运算表达式放在((和))之间。
表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。
可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。
表1:(( )) 的用法
((b=a-15))
((c=a+b)) 这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。
注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。 a=$((10+66)
b=$((a-15))
c=$((a+b)) 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。
注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。 ((a>7 && b==c)) (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。 echo $((a+10)) 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。 ((a=3+5, b=a+10)) 对多个表达式同时进行计算。
在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。
Shell (( )) 实例演示
【实例1】利用 (( )) 进行简单的数值计算。
[jb51.net]$ echo $((1+1)) 2 [jb51.net]$ echo $((6-3)) 3 [jb51.net]$ i=5 [jb51.net]$ ((i=i*2)) #可以简写为 ((i*=2))。 [jb51.net]$ echo $i #使用 echo 输出变量结果时要加 $。 10
【实例2】用 (( )) 进行稍微复杂一些的综合算术运算。
[jb51.net]$ ((a=1+2**3-4%3)) [c.biancheng.net]$ echo $a 8 [jb51.net]$ b=$((1+2**3-4%3)) #运算后将结果赋值给变量,变量放在了括号的外面。 [jb51.net]$ echo $b 8 [jb51.net]$ echo $((1+2**3-4%3)) #也可以直接将表达式的结果输出,注意不要丢掉 $ 符号。 8 [jb51.net]$ a=$((100*(100+1)/2)) #利用公式计算1+2+3+...+100的和。 [jb51.net]$ echo $a 5050 [jb51.net]$ echo $((100*(100+1)/2)) #也可以直接输出表达式的结果。 5050
【实例3】利用 (( )) 进行逻辑运算。
[jb51.net]$ echo $((3<8)) #3<8 的结果是成立的,因此,输出了 1,1 表示真 1 [jb51.net]$ echo $((8<3)) #8<3 的结果是不成立的,因此,输出了 0,0 表示假。 0 [jb51.net]$ echo $((8==8)) #判断是否相等。 1 [jb51.net]$ if ((8>7&&5==5)) > then > echo yes > fi yes
最后是一个简单的 if 语句的格式,它的意思是,如果 8>7 成立,并且 5==5 成立,那么输出 yes。显然,这两个条件都是成立的,所以输出了 yes。
【实例4】利用 (( )) 进行自增(++)和自减(--)运算。
[jb51.net]$ a=10 [jb51.net]$ echo $((a++)) #如果++在a的后面,那么在输出整个表达式时,会输出a的值,因为a为10,所以表达式的值为10。 10 [jb51.net]$ echo $a #执行上面的表达式后,因为有a++,因此a会自增1,因此输出a的值为11。 11 [jb51.net]$ a=11 [jb51.net]$ echo $((a--)) #如果--在a的后面,那么在输出整个表达式时,会输出a的值,因为a为11,所以表达式的值的为11。 11 [jb51.net]$ echo $a #执行上面的表达式后,因为有a--,因此a会自动减1,因此a为10。 10 [jb51.net]$ a=10 [jb51.net]$ echo $((--a)) #如果--在a的前面,那么在输出整个表达式时,先进行自增或自减计算,因为a为10,且要自减,所以表达式的值为9。 9 [jb51.net]$ echo $a #执行上面的表达式后,a自减1,因此a为9。 9 [jb51.net]$ echo $((++a)) #如果++在a的前面,输出整个表达式时,先进行自增或自减计算,因为a为9,且要自增1,所以输出10。 10 [jb51.net]$ echo $a #执行上面的表达式后,a自增1,因此a为10。 10
本教程假设读者具备基本的编程能力,相信读者对于前自增(前自减)和后自增(后自减)的区别也非常清楚,这里就不再赘述,只进行简单的说明:
- 执行 echo $((a++)) 和 echo $((a--)) 命令输出整个表达式时,输出的值即为 a 的值,表达式执行完毕后,会再对 a 进行 ++、-- 的运算;
- 而执行 echo $((++a)) 和 echo $((--a)) 命令输出整个表达式时,会先对 a 进行 ++、-- 的运算,然后再输出表达式的值,即为 a 运算后的值。
【实例5】利用 (( )) 同时对多个表达式进行计算。
[jb51.net]$ ((a=3+5, b=a+10)) #先计算第一个表达式,再计算第二个表达式 [jb51.net]$ echo $a $b 8 18 [jb51.net]$ c=$((4+8, a+b)) #以最后一个表达式的结果作为整个(())命令的执行结果 [jb51.net]$ echo $c 26
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]