shell变量的数值计算

目录

  • 算术运算符
  • 双小括号“(())”数值运算命令
    • 双小括号“(())”数值运算的基础语法
  • let运算命令的用法
  • expr命令的基本用法

算术运算符

shell中 常见的算术运算符号
算术运算符 意义(*表示常用)
+、- 加法(或正号)、减法(或负号)*
*、/、% 乘法、除法、取余(取模)*
** 幂运算*
++、– 增加及减少,可前置也可放在变量结尾*
!、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)*
<,<=、>、>= 比较符号(小于、小于等于、大于、大于等于)
==、!=、= 比较符号(相等、不相等,对于字符串“=”也可以表示相当于)*
<<、>> 向左位移,向右位移
~、|、&、^ 按位取反、按位异或、按位与、按位或
=、+=、-=、*=、/=、%= 赋值运算符,例如a+=1相当于a=a+1,a-=1相当于a=a-1 *
shell中常见的算术运算命令
运算操作符与运算命令 意义
(()) 用于整数运算的常用运算符,效率很高
let 用于整数运算,类似于“(())”
expr 可用于整数运算,但还有很多其他的额外功能
bc Linux下的一个计算器程序(适合整数及小数运算)
$[] 用于整数运算
awk awk即可以用于整数运算,也可以用于小数运算
declare 定义变量值和属性,-i参数可以用于定义整形变量,做运算

双小括号“(())”数值运算命令

双小括号“(())”数值运算的基础语法

  双小括号“(())”的作用是进行数值运算与比较,它的效率很高,用法灵活,是企业场景运维人员经常采用的运算操作符。

运算操作符与运算命令 意义
((i=i+1)) 此种书写方法为运算后赋值法,即将i+1的运算结果赋值给变量i。
注意,不能用“echo ((i=i+1))”的形式输出表达式的值,
但可以用echo $((i=i+1))输出其值
i=$((i+1)) 可以在“(())”前加$符,表示将表达式运算后赋值给i
((8>7&&5==5)) 可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断
echo $((2+1)) 需要直接输出运算表达式的运算结果时,可以在“(())”前加$符
提示:
  “(())”表达式在命令执行时不需要加$符号,直接使用((6%2))形式即可,但是如果需要输出,就要加$符号,例如:echo $((6%2))
  “(())”里的所有字符之间没有空格、有一个或多个空格都不会影响结果。

let运算命令的用法

[sy@sy-pc ~]$ i=2
[sy@sy-pc ~]$ i=i+8   #<==假如开头不用let进行赋值
[sy@sy-pc ~]$ echo $i #<==输出结果为i+8,也就是没有计算i+8
[sy@sy-pc ~]$ unset i
[sy@sy-pc ~]$ i=2
[sy@sy-pc ~]$ let i=i+8  #<==采用let赋值后再输出
[sy@sy-pc ~]$ echo $i
[sy@sy-pc ~]$ 10
提示:
  let i=i+8等同于((i=i+8)),但后者效率更高。

expr命令的基本用法

  expr (evaluate(求值) expressions(表达式))命令既可以用于整数运算,也可以用于相关字符串长度、匹配等得运算处理。
1.expr用于计算
语法:expr Expression

[sy@sy-pc ~]$ expr 2 + 2
[sy@sy-pc ~]$ expr 2 - 2
[sy@sy-pc ~]$ expr 2 \* 2	#<==*号用\来转义。
[sy@sy-pc ~]$ expr 2 / 2

要注意,在使用expr时:

  • 运算符及用于计算的数字左右都至少有一个空格,否则会报错。
  • 使用乘号时,必须用反斜线屏蔽其特定含义,因为shell可能会误解星号的含义。

2.expr配合变量计算
  expr在shell中可配合变量进行计算,但需要用反引号将计算表达式括起来。

[sy@sy-pc ~]$ i=5
[sy@sy-pc ~]$ i=`expr $i + 6`	
#<==注意用反引号将表达式引起来,变量和数字符号两边要有空格
[sy@sy-pc ~]$ echo $i
[sy@sy-pc ~]$ 11

3.判断一个变量值或字符串是否为整数
  在shell编程里,由于函数库很少,所以判断字符串是否为整数就不是一件很容易的事情。
  利用以expr做计算时变量或字符串必须是整数的规则,把一个变量或字符串和一个已知的整数(非0)相加,看命令返回的值是否为0,如果是0,就认为做加法的变量或字符串为整数,否则就不是整数。

[sy@sy-pc ~]$ i=5		#<==赋值一个数5给i
[sy@sy-pc ~]$ expr $i + 6		#<==把i和整数相加
11
[sy@sy-pc ~]$ expr $i + 6 &>/dev/null	#<==表示不保留任何输出
[sy@sy-pc ~]$ echo $?		#<==输出返回值
0		#<==返回0,则证明i的值为整数
[sy@sy-pc ~]$ i=hello
[sy@sy-pc ~]$ expr $i + 6 &>/dev/null
[sy@sy-pc ~]$ echo $?
2		#<==返回为非0,则证明i的值不是整数

通过传参判断输出内容是否为整数。

#! /bin/bash
[ $# -ne 1 ] && { echo '请在文件名后面输入一个正整数';exit 1; } || {  }
expr $1 + 1 >/dev/null 2>&1
[ $? -eq 0 ] && echo int || echo chars

你可能感兴趣的:(Linux)