zoukankan      html  css  js  c++  java
  • 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 中${},$[],$(()),[ ], (()), [[ ]]作用与区别
    C语言运算符优先级表

    作者简介

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

    作者简洁

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

  • 相关阅读:
    Python面向对象:继承和多态
    Python面向对象:类、实例与访问限制
    Python正则表达式匹配猫眼电影HTML信息
    Git:从github上克隆、修改和更新项目
    Python:闭包
    JPA-映射-(@ManyToMany)双向多对多
    rownum详解
    java之yield(),sleep(),wait()区别详解
    springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
    @RequestParam,@PathVariable,@ResponseBody,@RequestBody,@ModelAttribute学习
  • 原文地址:https://www.cnblogs.com/liabio/p/11946250.html
Copyright © 2011-2022 走看看