Shell与其他编程语言一样,支持多种类型的运算符,包括:
算术运算符:用于执行数学运算,例如加法、减法、乘法和除法。
关系运算符:用于比较两个值之间的关系,例如相等、大于、小于等。
布尔运算符: 用于执行逻辑运算,例如逻辑与、逻辑或、逻辑非。
字符串运算符:用于处理字符串,例如字符串连接、字符串相等性检查。
文件测试运算符: 用于检查文件属性,例如文件是否存在、文件是否可读等。
expr命令
expr (evaluate expressions 的缩写),译为"表达式求值", `expr`是一种表达式计算工具,用于执行表达式求值操作。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。
常用的算术运算符,假定变量 a 为 1,变量 b 为 2:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 3 |
- | 减法 | expr $a - $b 结果为 -1 |
* | 乘法 | expr $a \* $b 结果为 2 |
/ | 除法 | expr $b / $a 结果为 2 |
% | 取余 | expr $b % $a 结果为 0 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a |
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意**使用的是反引号 ` 而不是单引号 ',**这个字符不是常用的单引号,在 Esc 键下边。
- 如果四则运算中如果使用了(),需要转义
\( 30+ 1 \)
求值表达式
算术运算符表达式(交互式)
expr 1 + 11 # 返回: 12
expr \( 30 + 10 \) \* 2 + 100 # 返回:180
获取计算结果赋值给新变量语法
result=`expr 1 + 1` # 输出result得到结果: 2
2).echo+管道
字符串语法
语法 | 说明 | 示例 |
---|---|---|
expr length 字符串 | 计算字符串的长度 | expr length "helloworld" 返回: 10 |
expr substr 字符串 start end | 截取字符串 | expr substr "helloworld" 1 2 返回: hestart 截取字符串的起始位置,从1开始end 截取字符串的结束位置,包含这个位置截取 |
expr index 被查找字符串 需要查找的字符 | 获取第一个字符在字符串中出现的位置 | expr index "helloworld" l 返回: 3 |
expr match 字符串 正则表达式expr 字符串 : 正则表达式 | 正则表达式匹配,返回值为符合匹配字符的长度,否则返回为0 "expr match" 命令用于匹配一个字符串中的部分文本,而正则表达式 ".*o" 的含义如下: * . :匹配任意一个字符。 * * :匹配前面的字符(. )零次或多次,即匹配任意数量的字符。 * o :匹配字符 "o"。 |
expr match "helloworld" ".*o" 返回: 7 |
运行效果:
(())命令
双小括号(( )),用于进行数学运算表达式的执行 , 将数学运算表达式放在((和))之间。可以使用 获取(())表达式命令的结果,这和使用 获得变量值是一样的。
语法 | 说明 |
---|---|
((a=64+6)) ((b=a-6)) ((c=a+b*2)) | 这种写法可以在计算完成后给变量赋值。以 ((b=a-6)) 为例,即将 a-6的运算结果赋值给变量 c。 注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。 |
a=((1+6) b=((a-1)) c=$((a+b*2)) | 可以在 (( )) 前面加上符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=((a+b*2)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。 注意,如果 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。 |
((a>7 && b==c)) | (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。 |
echo $((a+10)) | 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。 |
((a=3+5, b=a+10)) | 对多个表达式同时进行计算, 多表表达式使用","号隔开 |
注意: 符号之间有无空格都可以 , (( a = 1 + 6 )) 等价于 ((a=1+6))
示例:ce.sh脚本代码
#!/bin/bash
# 计算1+6赋值给变量a
((a=1+6))
# 计算变量a-1赋值给变量b
((b=a-1))
# 计算变量a+变量b赋值给变量c
((c=a+b))
# 打印变量a,变量b, 变量c的值
echo "a=${a},b=${b},c=${c}"
# $赋值写法
a=$((1+6)) b=$((a-1)) c=$((a+b))
echo "a=${a},b=${b},c=${c}"
# (())多个表达式计算赋值
((a=1+6,b=a-1,c=a+b))
echo "a=${a},b=${b},c=${c}"
# echo输出直接使用(())
echo "1+6=$((1+6))"
# (()) 用于逻辑表达式 在if中使用
if ((a>7 && b==c))
then
echo "a>7 && b==c 成立"
else
echo "a>7 && b==c 不成立"
fi
运行效果:
总结:
- 括号内赋值: ((变量名=整数表达式))
- 括号外赋值: 变量名=$((整数表达式))
- 多表达式赋值: ((变量名1=整数表达式1,变量名2=整数表达式2,...))
- 与if条件句配合使用: if ((整数表达式))
let命令
let 命令和双小括号 (( )) 在数字计算方面功能一样。但是没有(())功能强大,let只能用于赋值计算,不能直接输出,不可以条件判断一起使用。let
主要用于赋值,是最简洁的整数运算赋值命令。
let 赋值表达式
# 计算赋值用法: let 变量名=整数运算表达式
# 多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 ...
- 语法功能等价于
((表达式))
- 多个表达式之间使用空格,不是"
,
"号 - 对于类似
let a+b
这样的写法,Shell 虽然计算了 a+b 的值,但却将结果丢弃。如果echo let a+b
会直接输出字符串a+b
;若不想这样,可以使用let sum=a+b
将 a+b 的结果保存在变量 sum 中。
$[]命令
在Linux和Unix Shell中,`\[\]\` 是一种旧的、过时的方法用于执行数学运算。它可以用来计算表达式的值。例如,您可以使用 \`[]` 来执行基本的算术运算,如加法、减法、乘法和除法。
效果展示:
四种计算命令对比
命令 | 优点 | 缺点 |
---|---|---|
expr | 可以直接输出。 | 计算表达式里面引用变量使用$,特殊字符需要转义,只能计算一个表达式。 |
(( )) | 直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值。(直接求值输出推荐方式) | 需要获取值以后才可以输出。 |
let | 赋值简单,特殊字符不需要转义。(赋值推荐方式) | 不能直接输出。 |
$[ ] | 特殊字符不需要转义。 | 不能多表达式计算。 |
bc命令
Bash Shell内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc (basic calculator)命令可以很方便的进行浮点运算。bc命令是Linux简单的计算器,能进行进制转换与计算。能转换的进制包括十六进制、十进制、八进制、二进制等。可以使用的运算符号包括(+)加法、(-)减法、(*)乘法、(/)除法、(^)指数、(%)余数等。
bc [options] [参数]
选项options:
选项 | 说明 |
---|---|
-h | help,帮助信息 |
-v | version,显示命令版本信息 |
-l | mathlib, 使用标准数学库,例如使用内置函数就需要必须使用这个参数 |
-i | interactive,强制交互 |
-w | warn,显示 POSIX 的警告信息 |
-s | standard,使用 POSIX 标准来处理 |
-q | quiet,不显示欢迎信息 |
注意:
默认使用bc命令后回车会有很多欢迎信息, 可以使用
bc -q
回车后不会有欢迎信息bc命令交互式下,输入quit 即可回到当前目录
bc
需要每个表达式单独一行,并且要在运算符周围使用空格
参数:指定包含计算任务的文件。
常见的内置函数:
|--------|---------------|
| 函数名 | 作用 |
| s(x) | 计算x的正弦值,x是弧度值 |
| c(x) | 计算x的余弦值,x是弧度值 |
| a(x) | 计算x的正切值,返回弧度值 |
| l(x) | 计算x的自然对数 |
| e(x) | 求e的x次方 |
| j(n,x) | 计算从n到x的阶数 |
| | |
| | |
[内置数学函数]
测试效果:
文件可以执行多条语句: