算术运算符——整数运算

算术运算符——整数运算

大家好,又见面了,我是全栈君。

shell中进行整数运算需要借助一些辅助工具,如:expr、declare、let、((  ))、$[  ]

1、expr有很多不完善之处,此处不写。

2、declare:

    declare -i 命令定义整形变量,当使用此命令对变量赋值后,变量便可进行算术运算。

    需要注意的是:

    如果给整形变量赋值的是一个字符串值,则bash会将变量赋值为0。

    使用declare -i命令生成的变量执行算术运算时,各变量之间不能有空格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
test@kickseed:~$ declare -i m n
test@kickseed:~$ m=1
test@kickseed:~$ n=2
test@kickseed:~$ m+=1
test@kickseed:~$ n+=2
test@kickseed:~$ echo $m $n
2 4
test@kickseed:~$ m=m+n
test@kickseed:~$ echo $m
6
 
新声明一个整形变量d,进行计算
test@kickseed:~$ declare -i d
test@kickseed:~$ d=m+n
test@kickseed:~$ echo $d
10
 
使用一个未声明为整形的变量c,进行计算
test@kickseed:~$ c=m+n
test@kickseed:~$ echo $c
m+n
 
使用双引号:
test@kickseed:~$ a=3
test@kickseed:~$ b=2
test@kickseed:~$ m="a+ b "
test@kickseed:~$ echo $m
5

    直接执行declare -i 命令可以查看已经定义的整形变量

1
2
3
4
5
6
7
test@kickseed:~$ declare -i
……
declare -ir UID="1000"
declare -i a="8"
declare -i d="10"
declare -i m="6"
declare -i n="4"

    使用declare -i 命令声明变量后还可以用不同进制的数字表示十进制数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
第一种写法:
test@kickseed:~$ declare -i m
test@kickseed:~$ m=2#101
test@kickseed:~$ echo $m
5
test@kickseed:~$ m=8#17
test@kickseed:~$ echo $m
15
test@kickseed:~$ m=16#b
test@kickseed:~$ echo $m
11
 
第二种写法:
test@kickseed:~$ declare -i n=017   其中017中的0代表八进制
test@kickseed:~$ echo $n
15

3、let: let是bash shell的一个内建命令。可以help let查看帮助

1
2
3
4
5
6
7
test@kickseed:~$ i=5
test@kickseed:~$ let i=i+1
test@kickseed:~$ echo $i
6
test@kickseed:~$ let "i = i + 2"
test@kickseed:~$ echo $i
8

    需要注意的是: 使用let时,如果运算表达式没有使用双引号,则表达式之间不能有空格;如果使用了双引号,则表达式之间可以有空格。

建议使用双引号。

4、((  )) :let也可以用((  ))替换

1
2
3
4
5
6
7
8
9
10
test@kickseed:~$ i=3
test@kickseed:~$ ((i+=2))
test@kickseed:~$ echo $i
5
test@kickseed:~$ (( i+= 2))
test@kickseed:~$ echo $i
7
test@kickseed:~$ (( "i+= 2" ))
test@kickseed:~$ echo $i
9

    ((  ))还可以直接一步出结果,有无空格无影响。双括号中不可以使用变量

1
2
3
souche@kickseed:~$ i=2
souche@kickseed:~$ echo $((i+= 3 ))
5

5、$[  ]  中括号中有无空格无影响。中括号中可以使用变量

1
2
3
4
5
6
7
8
test@kickseed:~$ var=$[1+ 2 ]
test@kickseed:~$ echo $var
3
test@kickseed:~$ echo $[3+2]
5
test@kickseed:~$ m=2
test@kickseed:~$ echo $[$m +1 ]
3

常见运算符号:

wKioL1mo0JXDY4WpAANQHfDLodE638.png

let使用双引号时支持:

+ – * / % >> << & ^ | > < =  以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
test@kickseed:~$ echo $m $n
7 2
test@kickseed:~$ let "c=m==n"
test@kickseed:~$ echo $c
0
test@kickseed:~$ let "c=m!=n"
test@kickseed:~$ echo $c
1
souche@kickseed:~$ let "c=(3>2) || (4<= 1 )"
souche@kickseed:~$ echo $c
1
souche@kickseed:~$ let "c=(3>2) && (4<= 1 )"
souche@kickseed:~$ echo $c
0
souche@kickseed:~$ let "c=(3<2) || (4<= 1 )"
souche@kickseed:~$ echo $c
0

((  ))等同于let

$[]  支持

+ – * / % >> << & ^ | > < =  以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符

1
2
3
4
souche@kickseed:~$ echo $[(3<
2
) || (4<= 1 )]
0
souche@kickseed:~$ echo $[(3>2) || (4<= 1 )]
1

declare -i声明整型变量后,需要使用双引号支持。

+ – * / % >> << & ^ | > < =  以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符

1
2
3
4
5
6
7
souche@kickseed:~$ declare -i m
souche@kickseed:~$ m="(3>2) || (4<= 1 )"
souche@kickseed:~$ echo $m
1
souche@kickseed:~$ m="(3<2) || (4<= 1 )"
souche@kickseed:~$ echo $m
0

总结:

1、declare -i声明整型变量后,变量运算最好使用双引号。

2、let 进行算术运算最好也使用双引号。

3、(())  等同于let,不需要使用双引号

4、$[]  不需要使用双引号

    上面4中算术运算辅助符,按照总结的使用说明时,在双引号和括号中的表达式有无空格都无影响,最好统一不带空格。

    都支持:+ – * / % >> << & ^ | > < =  以及这些符号与=号结合的符号。并且还支持 == 和 !=。即支持上述图中常见运算符

本文转自 f_066 51CTO博客,原文链接:http://blog.51cto.com/ganmu/1961520,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107871.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月12日 下午12:00
下一篇 2022年3月12日 下午12:00


相关推荐

  • 你真的熟练运用 HTML5 了吗,这10 个酷炫的 H5 特性你会几个?

    你真的熟练运用 HTML5 了吗,这10 个酷炫的 H5 特性你会几个?HTML5 不是什么新鲜事 自初始版本 2008 年 1 月 以来 我们一直在使用它的几个功能 我再次仔细查看了 HTML5 功能列表 看看我发现了什么 到目前为止 我还没有真正使用过很多 在本文中 我列出了 10 个这样的 HTML5 功能 这些功能过去我用得不多 但现在发现它们很有用 我还创建了一个工作示例流程并托管在 Netlify 希望你也觉得它有用 让我们开始了解有关它们中的每一个的解释 代码和快速提示 https wanghao221 github io html tips tricks

    2026年3月26日
    2
  • bat批处理注释方法总结

    bat批处理注释方法总结写 bat 批处理也一样 都要用到注释的功能 这是为了程式的可读性在批处理中 段注释有一种比较常用的方法 nbsp nbsp nbsp nbsp gotostart nbsp nbsp nbsp nbsp nbsp 可以是多行文本 可以是命令 nbsp nbsp nbsp nbsp nbsp 可以包含重定向符号和其他特殊字符 nbsp nbsp nbsp nbsp nbsp 只要不包含 start 这一行 就都是注释 nbsp nbsp nbsp nbsp start 另外 还有其他各种注释形式 比如 nbsp nbsp nbsp nbsp 1 注释内容 第一个冒号后也可以

    2026年3月18日
    2
  • 申万宏源:豆包大模型加速商业化落地 端侧AI硬件生态百花齐放

    申万宏源:豆包大模型加速商业化落地 端侧AI硬件生态百花齐放

    2026年3月12日
    2
  • php-openssl降级,openssl升级降级

    php-openssl降级,openssl升级降级1 下载源码包 wgethttp www openssl org source openssl 1 0 2d tar gz2 安装到 usr local ssl 目录下 tarzxvfopens 1 0 2d tar gzcdopenssl 1 0 2d configprefix usr local sslmake amp amp makeinstallm f

    2026年3月16日
    2
  • [Java] volatile 详详解![通俗易懂]

    [Java] volatile 详详解![通俗易懂]前言:要真正搞懂volatile的特性需要与JMM对比来看JMM(线程安全的保证)JMM:JAVA内存模型(javamemorymodel)是一种抽象概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步的规定线程解锁前,必须把共享变量的值刷新回主内存;线程加锁前,必须读取主内存的最…

    2022年7月7日
    17
  • Wing Pro 11 的新增功能 – Python IDE

    Wing Pro 11 的新增功能 – Python IDE

    2026年3月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号