算术运算

算数表达式相关符号

+

-

*

/

**

  • 乘方

%

  • 取余

++

  • 自增,将变量的值加1

什么是i++,什么是++i

i++++i 都是一元运算符,用于将变量 i 的值加1。

i++ 表示先取变量 i 的当前值,然后再将 i 的值加1,也就是说先使用变量的值再进行自增操作。例如:

i=5

echo $i   # 输出 5
echo $((i++))   # 输出 5
echo $i   # 输出 6

++i 表示先将 i 的值加1,然后再取 i 的新值,也就是说先进行自增操作再使用变量的值。例如:

i=5

echo $i   # 输出 5
echo $((++i))   # 输出 6
echo $i   # 输出 6

在 Shell 中,i++++i 这两个运算符的作用与使用场景与其他编程语言中的用法是相同的。它们通常用于循环、条件判断等语句中,用来控制变量的值和执行流程。

i++和++i的区别

i++++i 都是一元运算符,用于将变量 i 的值加1。它们的区别在于它们执行自增操作的时机不同。

i++ 是后置自增运算符,表示先使用变量的值,然后再将变量的值加1。例如,假设 i 的初始值为5,执行 j = i++,则 j 的值为5,而 i 的值变为6。

++i 是前置自增运算符,表示先将变量的值加1,然后再使用变量的新值。例如,假设 i 的初始值为5,执行 j = ++i,则 j 的值为6,而 i 的值也是6。

因此,i++++i 的结果不同,尤其是在赋值语句中。在循环语句中,如果使用 i++,则循环会先执行循环体,然后再将 i 的值加1;而如果使用 ++i,则循环会先将 i 的值加1,然后再执行循环体。这些细微的差别可以根据具体的编程需要进行选择。

什么是一元运算

一元运算是指只需要一个操作数就能进行计算的运算。在计算机编程中,一元运算通常是通过一元运算符来实现的,一元运算符只作用于一个操作数。

在 Shell 编程中,常见的一元运算符有:

  • 自增运算符 ++:用于将变量的值加1。
  • 自减运算符 –:用于将变量的值减1。
  • 取反运算符 !:用于对布尔值取反。
  • 算术取反运算符 -:用于对数值进行取反。
  • 位取反运算符 ~:用于对二进制数进行按位取反。

一元运算常常用在循环、条件语句、赋值语句等地方,用于对变量的值进行修改或处理。

  • 自减,将变量的值减1

什么是i–,什么是–i

i----i 都是一元运算符,用于将变量 i 的值减1。

i-- 表示先取变量 i 的当前值,然后再将 i 的值减1,也就是说先使用变量的值再进行自减操作。例如:

i=5
echo $i   # 输出 5
echo $((i--))   # 输出 5
echo $i   # 输出 4

--i 表示先将 i 的值减1,然后再取 i 的新值,也就是说先进行自减操作再使用变量的值。例如:

i=5
echo $i   # 输出 5
echo $((--i))   # 输出 4
echo $i   # 输出 4

在 Shell 中,i----i 这两个运算符的作用与使用场景与其他编程语言中的用法是相同的。它们通常用于循环、条件判断等语句中,用来控制变量的值和执行流程。

i++++i 相似,i----i 也是有区别的,i-- 是后置自减运算符,表示先使用变量的值,然后再将变量的值减1;--i 是前置自减运算符,表示先将变量的值减1,然后再使用变量的新值。

i–和–i的区别

i----i 都是一元运算符,用于将变量 i 的值减1。它们的区别在于它们执行自减操作的时机不同。

i-- 是后置自减运算符,表示先使用变量的值,然后再将变量的值减1。例如,假设 i 的初始值为5,执行 j = i--,则 j 的值为5,而 i 的值变为4。

--i 是前置自减运算符,表示先将变量的值减1,然后再使用变量的新值。例如,假设 i 的初始值为5,执行 j = --i,则 j 的值为4,而 i 的值也是4。

因此,与 i++++i 相似,i----i 也有区别,它们在赋值语句中会产生不同的结果。在循环语句中,如果使用 i--,则循环会先执行循环体,然后再将 i 的值减1;而如果使用 --i,则循环会先将 i 的值减1,然后再执行循环体。这些细微的差别可以根据具体的编程需要进行选择。

+=

在Shell编程中,+= 是一种赋值运算符,它可以用来给变量加上一个值,并将计算结果赋值给该变量。+= 的语法形式如下:

variable+=value
  • variable 表示要被加值的变量
  • value 表示要加上的值

例如,假设变量 num 的初始值为5,执行 num+=3 将会把3加到变量 num 的值上,得到8,相当于执行了 num=num+3,代码示例如下:

num=5

num+=3    # 等价于 num=num+3,即 num=5+3=8

echo $num    # 输出 8

+= 运算符可以用于各种数据类型的变量,包括整数、浮点数和字符串。例如:

## 对整数变量的使用
x=10
x+=5
echo $x    # 输出 15

## 对浮点数变量的使用
y=3.14
y+=1.23
echo $y    # 输出 4.37

## 对字符串变量的使用
str="hello"
str+=" world"
echo $str    # 输出 "hello world"

使用 += 运算符可以使代码更简洁、易读,并且减少代码量,因此在Shell编程中经常会使用该运算符。

-=

在Shell编程中,-= 是一种赋值运算符,它可以用来从变量中减去一个值,并将计算结果赋值给该变量。-= 的语法形式如下:

variable-=value

其中 variable 表示要被减值的变量,value 表示要减去的值。

例如,假设变量 num 的初始值为10,执行 num-=3 将会从变量 num 的值中减去3,得到7,相当于执行了 num=num-3,代码示例如下:

num=10
num-=3    # 等价于 num=num-3,即 num=10-3=7
echo $num    # 输出 7

-= 运算符可以用于各种数据类型的变量,包括整数、浮点数和字符串。例如:

## 对整数变量的使用
x=10
x-=5
echo $x    # 输出 5

## 对浮点数变量的使用
y=3.14
y-=1.23
echo $y    # 输出 1.91

## 对字符串变量的使用
str="hello world"
str=${str%"world"}   # 从字符串尾部删除 "world"
echo $str    # 输出 "hello "

使用 -= 运算符可以使代码更简洁、易读,并且减少代码量,因此在Shell编程中经常会使用该运算符。

*=

在Shell编程中,*= 是一种赋值运算符,它可以用来给变量乘以一个值,并将计算结果赋值给该变量。*= 的语法形式如下:

variable*=value

其中 variable 表示要被乘的变量,value 表示要乘上的值。

例如,假设变量 num 的初始值为5,执行 num*=3 将会把3乘到变量 num 的值上,得到15,相当于执行了 num=num*3,代码示例如下:

num=5
num*=3    # 等价于 num=num*3,即 num=5*3=15
echo $num    # 输出 15

*= 运算符可以用于各种数据类型的变量,包括整数、浮点数和字符串。例如:

## 对整数变量的使用
x=10
x*=5
echo $x    # 输出 50

## 对浮点数变量的使用
y=3.14
y*=1.23
echo $y    # 输出 3.8642

## 对字符串变量的使用
str="hello"
str*="3"   # 将字符串 "hello" 重复3次,得到 "hellohellohello"
echo $str    # 输出 "hellohellohello"

使用 *= 运算符可以使代码更简洁、易读,并且减少代码量,因此在Shell编程中经常会使用该运算符。

/=

在Shell编程中,/= 是一种赋值运算符,它可以用来给变量除以一个值,并将计算结果赋值给该变量。/= 的语法形式如下:

variable/=value

其中 variable 表示要被除数的变量,value 表示要除以的值。

例如,假设变量 num 的初始值为10,执行 num/=2 将会把变量 num 的值除以2,得到5,相当于执行了 num=num/2,代码示例如下:

num=10
num/=2    # 等价于 num=num/2,即 num=10/2=5
echo $num    # 输出 5

需要注意的是,如果除数为0,则会产生错误。例如,执行以下代码会报错:

num=10
num/=0    # 除以0会产生错误

/= 运算符可以用于各种数据类型的变量,包括整数、浮点数和字符串。例如:

## 对整数变量的使用
x=10
x/=2
echo $x    # 输出 5

## 对浮点数变量的使用
y=3.14
y/=2
echo $y    # 输出 1.57

## 对字符串变量的使用
str="hello"
str/=2    # 不能用于字符串
echo $str    # 输出 "hello"

使用 /= 运算符可以使代码更简洁、易读,并且减少代码量,因此在Shell编程中经常会使用该运算符。

%=

在Shell编程中,%= 是一种赋值运算符,它可以用来给变量取模(即求余数),并将计算结果赋值给该变量。%= 的语法形式如下:

variable%=value

其中 variable 表示要被取模的变量,value 表示要取模的值。

例如,假设变量 num 的初始值为10,执行 num%=3 将会把变量 num 的值对3取模,得到1,相当于执行了 num=num%3,代码示例如下:

num=10
num%=3    # 等价于 num=num%3,即 num=10%3=1
echo $num    # 输出 1

%= 运算符只能用于整数变量,不能用于浮点数和字符串。例如:

## 对整数变量的使用
x=10
x%=3
echo $x    # 输出 1

## 不能用于浮点数变量
y=3.14
y%=2    # 不能用于浮点数
echo $y    # 输出 "3.14"

## 不能用于字符串变量
str="hello"
str%=2    # 不能用于字符串
echo $str    # 输出 "hello"

使用 %= 运算符可以使代码更简洁、易读,并且减少代码量,因此在Shell编程中经常会使用该运算符。

算数表达式语法

  • expression 是算术表达式,可以使用算术运算符、括号、变量和常量等。

$((expression))

范例

  • 注意:算数表达式中的变量需要使用$符号进行引用,例如$a表示变量a的值,而a表示字符串"a"。
## a=5
## b=3


## echo $((a + b))
8


## echo $((a * (b + 2)))
25

$[expression]

范例

  • 注意:算数表达式中的变量需要使用$符号进行引用,例如$a表示变量a的值,而a表示字符串"a"。
## a=5
## b=3


## echo $[a - b]
2

let expression

  • let 是 Shell 内置命令,也可以用来执行算术表达式。 let 命令可以让我们在不使用$符号的情况下使用算术表达式。

范例

  • let 命令中,如果要使用变量,直接使用变量名即可,不需要在变量名前面添加 $ 符号。
  • let 命令中,还可以使用变量名的简写形式,例如 let a++,表示将变量 a 的值加1。
## a=5
## b=3


## let c=a+b
## echo $c
8


## let "d=a*b"
## echo $d
15


## let "e=(a + b) * 2"
## echo $e
16

((expression)

  • ((expression) 和 let expression 等价
  • ((expression)) 中,可以使用变量名的简写形式,例如 ((a++)) 表示将变量 a 的值加1。

算数表达式范例

生成范围随机数

$RANDOM 是 Bash Shell 中内置的随机数生成变量,用于生成 0 到 32767($((2**15-1)))之间的随机整数。

  • 生成 0 - 32 之间下·的随机数
## echo $[RANDOM%33]
27
  • 随机字体颜色
## echo -e "\033[1;$[RANDOM%7+31]mhello\033[0m"

这是一个 Bash Shell 命令,它用于在控制台上输出带有随机字体颜色的 “hello” 字符串。现在来详细解释一下每个部分的含义:

  • echo: 输出命令。
  • -e: 激活转义字符的解析,使得输出中的转义字符可以正常工作。
  • "\033[1;$[RANDOM%7+31]m": 这是控制输出颜色的ANSI转义序列,其中:
    • \033 是 ASCII 转义字符的八进制编码,用于指示后续字符序列是 ANSI 控制序列。
    • [1; 是控制文本样式的部分,这里的 “1” 表示粗体字体。
    • $[RANDOM%7+31] 是一个算术表达式,它将生成一个 31 到 37 之间的随机数。RANDOM 是 Bash Shell 内置的随机数变量,%7 将生成 0 到 6 之间的随机数,然后加上 31,得到 31 到 37 之间的随机数。
    • m 是 ANSI 控制序列的结束字符,表示样式控制部分的结束。
  • hello: 要输出的文本。
  • \033[0m: 这是另一个 ANSI 控制序列,它将颜色和样式重置为默认值,以确保后续文本不受影响。

因此,该命令的目的是输出带有随机颜色和粗体字体的 “hello” 字符串,颜色为 31 到 37 之间的随机颜色。

以下是一个使用Bash Shell生成随机字体颜色,输出文字内容为"hello"的示例脚本:

#!/bin/bash

## 定义颜色数组
colors=('0;31' '0;32' '0;33' '0;34' '0;35' '0;36' '1;31' '1;32' '1;33' '1;34' '1;35' '1;36')

## 生成随机数
color=${colors[$RANDOM % ${#colors[@]}]}

## 输出带有随机字体颜色的"hello"字符串
echo -e "\033[${color}mhello\033[0m"

该脚本将定义一个颜色数组,其中包含12种不同的ANSI颜色代码。然后,它将使用Bash内置的$RANDOM变量生成一个随机数,该随机数将用于从颜色数组中选择一个随机颜色代码。最后,它将输出带有所选随机颜色的"hello"字符串。

在该脚本中,\033[是一个ANSI转义序列,用于控制文本输出的颜色和样式。${color}将被替换为所选的随机颜色代码。\033[0m将重新设置颜色为默认值,以便后续文本不受影响。

11

Bash Shell提供了多种算术运算方式,包括整数算术运算、浮点数算术运算和位运算。下面分别介绍这些运算的详细用法。

  1. 整数算术运算

整数算术运算使用(( ))$(( ))语法。其中(( ))用于在条件语句中进行整数比较和运算,而$(( ))用于在命令中进行整数运算。

下面是一些整数算术运算的示例:

## 在条件语句中进行比较
if ((a > b)); then
  echo "a is greater than b"
fi

## 在命令中进行运算
c=$((a + b))
echo "c = $c"
  1. 浮点数算术运算

Bash Shell不支持原生的浮点数算术运算,但可以通过bc命令实现浮点数的计算。bc命令是一个命令行下的计算器,可以执行任意精度的数字计算。

下面是一个浮点数算术运算的示例:

## 计算平方根
a=5
b=$(echo "scale=2;sqrt($a)" | bc)
echo "Square root of $a is $b"
  1. 位运算

Bash Shell支持多种位运算操作,包括与、或、异或、左移和右移。位运算使用&|^<<>>等符号进行操作。

下面是一些位运算的示例:

## 与运算
a=5
b=6
c=$((a & b))
echo "a & b = $c"

## 或运算
c=$((a | b))
echo "a | b = $c"

## 异或运算
c=$((a ^ b))
echo "a ^ b = $c"

## 左移运算
c=$((a << 1))
echo "a << 1 = $c"

## 右移运算
c=$((b >> 1))
echo "b >> 1 = $c"

总的来说,Bash Shell提供了丰富的算术运算方式,可以根据不同的需求进行选择和组合使用。