作者简介


作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写linux、golang、docker、kubernetes等知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明 作者:小碗汤)


最近在网上看到一个问题:

#!/bin/bash
number=10
index=20
aa=$(( 2#1 << number | index))
echo ${aa}

执行上面的shell结果是什么?

#作用是什么?

首先得弄清楚​​#​​是什么意思?网上搜了一大圈没搜到,自己做几个实验看看:

[root@liabio test]# 
[root@liabio test]# echo $((2#000))
0
[root@liabio test]# echo $((2#001))
1
[root@liabio test]# echo $((2#010))
2
[root@liabio test]# echo $((2#011))
3
[root@liabio test]# echo $((2#012))
-bash: 2#012: value too great for base (error token is "2#012")
[root@liabio test]# echo $((2#100))
4
[root@liabio test]# echo $((2#101))
5
[root@liabio test]# echo $((2#102))
-bash: 2#102: value too great for base (error token is "2#102")
[root@liabio test]# echo $((2#110))
6
[root@liabio test]# echo $((2#111))
7
[root@liabio test]# echo $((2#1000))
8
[root@liabio test]# echo $((16#ff))
255
[root@liabio test]# echo $((16#1))
1
[root@liabio test]# echo $((16#16))
22
[root@liabio test]# echo $((16#15))
21
[root@liabio test]# echo $((16#10))
16
[root@liabio test]# echo $((16#9))
9
[root@liabio test]# echo $((16#a1))
161
[root@liabio test]# echo $((16#a))
10
[root@liabio test]# echo $((16#b))
11

可以看到​​#​​作用是进制转换,即a#b代表a进制的b转换为十进制。

$[]和$(())

它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

运算符优先级

左移符号​​<<​​​和按位或符号​​|​​优先级哪个高?

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名 [ 常量表达式 ]

左到右

1

()

圆括号

(表达式) / 函数名 ( 形参表 )

左到右

1

.

成员选择(对象)

对象 . 成员名

左到右

1

->

成员选择(指针)

对象指针 -> 成员名

左到右

2

-

负号运算符

- 表达式

右到左

单目运算符

2

( 类型 )

强制类型转换

( 数据类型 ) 表达式

右到左

2

++

自增运算符

++ 变量名 / 变量名 ++

右到左

单目运算符

2

--

自减运算符

-- 变量名 / 变量名 --

右到左

单目运算符

2

*

取值运算符

* 指针变量

右到左

单目运算符

2

&

取地址运算符

& 变量名

右到左

单目运算符

2

!

逻辑非运算符

! 表达式

右到左

单目运算符

2

~

按位取反运算符

~ 表达式

右到左

单目运算符

2

sizeof

长度运算符

sizeof( 表达式 )

右到左

3

/

表达式 / 表达式

左到右

双目运算符

3

*

表达式 * 表达式

左到右

双目运算符

3

%

余数(取模)

整型表达式 / 整型表达式

左到右

双目运算符

4

+

表达式 + 表达式

左到右

双目运算符

4

-

表达式 - 表达式

左到右

双目运算符

5

<<

左移

变量 << 表达式

左到右

双目运算符

5

>>

右移

变量 >> 表达式

左到右

双目运算符

6

>

大于

表达式 > 表达式

左到右

双目运算符

6

>=

大于等于

表达式 >= 表达式

左到右

双目运算符

6

<

小于

表达式 < 表达式

左到右

双目运算符

6

<=

小于等于

表达式 <= 表达式

左到右

双目运算符

7

==

等于

表达式 == 表达式

左到右

双目运算符

7

!=

不等于

表达式 != 表达式

左到右

双目运算符

8

&

按位与

表达式 & 表达式

左到右

双目运算符

9

^

按位异或

表达式 ^ 表达式

左到右

双目运算符

10

|

按位或

表达式 | 表达式

左到右

双目运算符

11

&&

逻辑与

表达式 && 表达式

左到右

双目运算符

12

||

逻辑或

表达式 || 表达式

左到右

双目运算符

13

?:

条件运算符

表达式 1? 表达式 2: 表达式 3

右到左

三目运算符

14

=

赋值运算符

变量 = 表达式

右到左

14

/=

除后赋值

变量 /= 表达式

右到左

14

*=

乘后赋值

变量 *= 表达式

右到左

14

%=

取模后赋值

变量 %= 表达式

右到左

14

+=

加后赋值

变量 += 表达式

右到左

14

-=

减后赋值

变量 -= 表达式

右到左

14

<<=

左移后赋值

变量 <<= 表达式

右到左

14

>>=

右移后赋值

变量 >>= 表达式

右到左

14

&=

按位与后赋值

变量 &= 表达式

右到左

14

^=

按位异或后赋值

变量 ^= 表达式

右到左

14

|=

按位或后赋值

变量 |= 表达式

右到左

15

,

逗号运算符

表达式 , 表达式 , …

左到右

从左向右顺序运算

同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || >赋值运算符

结果

#!/bin/bash
number=10
index=20
aa=$(( 2#1 << number | index))
echo ${aa}

1左移10位相当于1*2^10=1024

10000000000
00000010100
------------
10000010100
------------
即10进制的2^2+2^4+2^10=1044
[root@liabio test]# cat aa.sh 
#!/bin/bash

number=10
index=20

aa=$((2#1 << number | index))
echo $aa


[root@liabio test]# sh aa.sh
1044

参考

​Linux shell 中${},$[],$(()),[ ], (()), [[ ]]作用与区别​

​C语言运算符优先级表​

作者简介


作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写linux、golang、docker、kubernetes等知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源