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~按位取反运算符~ 表达式右到左单目运算符
2sizeof长度运算符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等知识等提升硬实力的文章,期待你的关注。转载说明:务必注明来源(注明:来源于公众号:我的小碗汤, 作者:小碗汤)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击云原生

众筹一元植发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值