小碗汤 · 2019年11月27日

shell脚本中的#是什么意思?aa=$(( 2#1 number | index))最终aa等于多少?

作者简介

作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写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 中${},$[],$(()),[ ], (()), [[ ]]作用与区别](https://blog.csdn.net/x126977...
C语言运算符优先级表

作者简介

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

作者简洁

作者:小碗汤,一位热爱、认真写作的小伙,目前维护原创公众号:『我的小碗汤』,专注于写go语言、docker、kubernetes、java等开发、运维知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤,作者:小碗汤)
推荐阅读
关注数
1
文章数
116
微信公众号【我的小碗汤】博主,分享技术文章和记录编程中遇到的问题及解决方案,工作中提高效率的工具,推送原创文章及优秀文章等
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息