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

本贴最后更新于 1605 天前,其中的信息可能已经时过境迁

作者简介

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

  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
liabio
公众号【mysmallsoup】专注于 Java、Go 语言 (Golang)、Docker、Kubernetes、软件架构 香港