最近在网上看到一个问题:
#!/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