文章目录
😹 作者: gh-xiaohe
😻 gh-xiaohe的博客
😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!
🚏 Shell计算命令
🚀 Shell计算命令:expr命令详解
目标:
- 1、理解expr命令的作用
介绍:
- expr (evaluate expressions 的缩写),译为“表达式求值”。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等.
🚬 求值表达式(整数 前面)
计算语法
expr 算术运算符表达式
# 例如: expr 1 + 1 返回: 2
# 例如: expr \( 10 + 10 \) \* 2 + 100 返回:140
获取计算结果赋值给新变量语法
result=`expr 算术运算符表达式`
# 例如: result=`expr 1 + 1` 输出result得到结果: 2
🚬 字符串语法
计算字符串的长度语法
expr length 字符串 # 例如: expr length "itheima" 返回: 7
截取字符串语法
expr substr 字符串 start end # start 截取字符串的起始位置, 从1开始 # end 截取字符串的结束位置, 包含这个位置截取 # 例如 expr substr "itheima" 1 2 返回: it
获取第一个字符在字符串中出现的位置语法
expr index 被查找字符串 需要查找的字符 # 例如 expr index "itheima" t 会返回: 2
正则表达式匹配1语法
expr match 字符串 正则表达式 # 正则表达式默认带有^ , 代表以什么开头 # 返回值为符合匹配字符的长度, 否则返回为0 # 例如: expr match "itheima" ".*m" 会返回: 6 # 正则表达式通配符"."代表任意一个字符 # 正则表达式通配符"*"代表签名的字符可以出现0到多次 # ".*m" 含义为匹配字符串中m前面的字符串长度
正则表表达式匹配2语法, 功能与语法1一样
expr 字符串 : 正则表达式 # 正则表达式默认带有^ , 代表以什么开头 # 返回值为符合匹配字符的长度, 否则返回为0 # 例如: expr "itheima" : ".*m" 会返回: 6
演示:
- 需求
# 四则运算: ( 10 + 10 ) * 2 + 100 # 计算"itheima"字符串的长度 # 获取"itheima"字符串中"t"第一个字符在字符串中出现的位置 # 正则表达式match匹配查找itheima字符串中m前面任意字符的总长度
cal1.sh脚本文件代码
#!/bin/bash # 四则运算 result=`expr \( 10 + 10 \) \* 2 + 100` echo "(10+10)*2+100=${result}" # 计算字符串的长度 echo "itheima字符串长度=`expr length "itheima"`" # 获取第一个字符在字符串中出现的位置 echo "itheima字符串中第一个t的位置=`expr index "itheima" t`" # 正则表达式匹配1 echo "正则表达式match匹配查找itheima字符串中m前面任意字符的总长度=`expr match "itheima" ".*m"`" # 正则表达式匹配2 echo "正则表达式匹配查找itheima字符串中m前面任意字符的总长度=`expr "itheima" : ".*m"`"
🚬 小结
expr命令的作用
- 1、整数计算
expr 整数运算表达式
- 2、字符串操作
- 1、expr length 字符串 获取字符串的长度
- 2、expr substr 字符串 start end 截取字符串
- 3、expr index 字符串 查找的字符 查找字符在字符串中第一次出现的位置, 位置从1开始的
- 4、expr match 字符串 正则表达式
- 5、expr 字符串: 正则表达式
🚄 Shell计算命令:(())命令详解
目标:
-
1、能够使用(())进行整数的数学运算
-
(())是在比较运算符的时候不建议使用、在整数计数方面非常实用
介绍:
- 双小括号 (( )) , 用于进行数学运算表达式的执行 , 将数学运算表达式放在
((
和))
之间。 - 可以使用
$
获取 (( )) 表达式命令的结果,这和使用$
获得变量值是一样的。
语法:
((表达式))
用法:
- 看总结
运算操作符/运算命令 | 说明 |
---|---|
((a=1+6)) ((b=a-1)) ((c=a+b)) | 这种写法可以在计算完成后给变量赋值。以 ((b=a-1)) 为例, 即将 a-1 的运算结果赋值给变量 c。 注意,使用变量时不用加 $ 前缀,(( )) 会自动解析变量名。 |
a=$((1+6) b=$((a-1)) c=$((a+b)) | 可以在 (( )) 前面加上$ 符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 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))
案例演示:
需求
# 计算1+6赋值给变量a # 计算变量a-1赋值给变量b # 计算变量a+变量b赋值给变量c # 打印变量a,变量b, 变量c的值 # $赋值写法 # (())多个表达式计算赋值 # echo输出直接使用(()) # (()) 用于逻辑表达式 在if中使用
calculatej2.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、括号内赋值:((变量名=整数表达式))
- 2、括号外赋值:变量名=$((整数表达式))
- 3、多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2,…))
- 4、与if条件句配合使用:if ((整数表达式))
🚒 Shell计算命令:let命令详解
目标:
- 1、能够使用let进行整数的数学运算赋值
- 赋值方面简洁(整数),计算方面差一些
介绍:
- let 命令和双小括号 (( )) 在数字计算方面功能一样. 但是没有(())功能强大, let只能用于赋值计算, 不能直接输出, 不可以条件判断一起使用
语法:
let 赋值表达式
注意:
- 1、语法功能等价于
((表达式))
- 2、多个表达式之间使用空格, 不是","号
- 3、对于类似
let a+b
这样的写法,Shell 虽然计算了 a+b 的值,但却将结果丢弃, 如果echo let a+b
会直接输出字符串a+b
;若不想这样,可以使用let sum=a+b
将 a+b 的结果保存在变量 sum 中。
输出建议使用(())
案例演示:
需求
# 计算变量a-1赋值给变量b # 计算变量a+变量b赋值给变量c # 打印变量a,变量b, 变量c的值 # let多个表达式计算赋值
calculate3.sh脚本代码
#!/bin/bash # 计算1+6赋值给变量a let a=1+6 # 计算变量a-1赋值给变量b let b=a-1 # 计算变量a+变量b赋值给变量c let c=a+b # 打印变量a,变量b, 变量c的值 echo "a=${a},b=${b},c=${c}" # let多个表达式计算赋值 let a=1+6 b=a-1 c=a+b echo "a=${a},b=${b},c=${c}"
🚬 小结
let数字计算用法
作用: 用于赋值,是最简洁的整数运算赋值命令
- 计算赋值用法: let 变量名=整数运算表达式
- 多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 …
🚤 Shell计算命令:$[]命令详解
目标:
- 1、能够使用$[]进行整数的数学运算
介绍:
- 和 (())、let 命令类似,$[] 也只能进行整数运算。但是只能对单个表达式的计算求值与输出
语法:
$[表达式]
1、$[] 会对
表达式
进行计算,并取得计算结果
2、表达式内部不可以赋值给变量
案例演示:
calculate4.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}" # 直接输出 echo "$[1+6],$[7-1],$[7+6]"
🧭 执行整数表达式命令总结
执行整数表达式命令的总结, 推荐使用哪个:
- expr
- 优点: 可以直接输出
- 缺点: 计算表达式里面引用变量使用$, 特殊字符需要转义 只能计算一个表达式
- (()) (直接求值输出推荐方式)
- 优点: 直接输出, 里面直接使用变量名, 特殊字符不需要转义, 多个表达式赋值
- 缺点: 需要获取值以后才可以输出
- let (赋值推荐方式)
- 优点: 赋值简单,特殊字符不需要转义
- 缺点: 不能直接输出
- $[]
- 优点: ,特殊字符不需要转义
- 缺点: 不能多表达是计算
🚗 Shell计算命令:bc命令详解
目标:
-
1、理解bc命令的作用
-
2、能够在bc中进行互动式的数学运算
-
3、能够在shell中进行非互动式的bc管道运算
-
4、能够在shell中非互动式的输入重定向bc运算
介绍:
- Bash shell内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc (basic calculator)命令可以很方便的进行浮点运算. bc命令是Linux简单的计算器,能进行进制转换与计算。能转换的进制包括十六进制、十进制、八进制、二进制等。可以使用的运算符号包括(+)加法、(-)减法、(*)乘法、(/)除法、(^)指数、(%)余数等
🚬 bc命令
语法:
bc [options] [参数]
options
选项 | 说明 |
---|---|
-h | help,帮助信息 |
-v | version,显示命令版本信息 |
-l | mathlib, 使用标准数学库, 例如使用内置函数就需要使用这个参数 |
-i | interactive, 强制交互 |
-w | warn, 显示 POSIX 的警告信息 |
-s | standard, 使用 POSIX 标准来处理 |
-q | quiet, 不显示欢迎信息 |
默认使用bc命令后回车会有很多欢迎信息, 可以使用
bc -q
回车后不会有欢迎信息
参数
文件 指定包含计算任务的文件
🚭 示例1:演示bc
🚭 示例2:bc执行计算任务的文件
创建task.txt文件, 编辑文件内容(一个计算表达式一行)
108*67+12345 58+2007*11
🚬 内置变量
变量名 | 作 用 |
---|---|
scale | 指定精度,也即小数点后的位数, 对计算结果指定保留小数;默认为 0,也即不使用小数部分。 |
ibase | 指定输入的数字的进制,默认为十进制。 |
obase | 指定输出的数字的进制,默认为十进制。 |
last 或者 . | 获取最近计算打印结果的数字 |
🚬 内置数学函数
- 必须启用 -l参数,才能使用数学函数
函数名 | 作用 |
---|---|
s(x) | 计算 x 的正弦值,x 是弧度值。 |
c(x) | 计算 x 的余弦值,x 是弧度值。 |
a(x) | 计算 x 的反正切值,返回弧度值。 |
l(x) | 计算 x 的自然对数。 |
e(x) | 求 e 的 x 次方。 |
j(n, x) | 贝塞尔函数,计算从 n 到 x 的阶数。 |
🚭 作用
通常在linux下bc当计算器用, 具体有3个用法:
- 1、bc中互动式的数学运算
- 2、shell中非互动式的管道运算
- 3、shell中非互动式的输入重定向运算
🚭 示例1:bc中互动式的数学运算
介绍:
使用 bc -q
命令,回车即可, 直接进行计算器进行运算
演示:
退出bc使用quit
🚭 示例2:shell中非互动式的管道运算
介绍:
在 Shell 脚本中,我们可以借助管道使用 bc 计算器。
借助管道使用 bc 计算器语法
1、直接进行bc的表达式计算输出
# 输出 bc表达式 参数 echo "expression" | bc [options]
“expression” 表达式必须复合bc命令要求的公式
“expression” 表达式里面可以引用shell变量
例如: Shell变量
a=2
在表达式里面引用的语法:$a
2、将bc计算结果赋值给Shell变量
# 第一种方式 var_name=`echo "expression" | bc [options]` # 第二种方式 var_name=$(echo "expression" | bc [options])
$() 与 `` 功能一样, 都是执行里面的命令
区别
- ``是所有linux系统支持的方式, 兼容性较好, 但是容易与引号产生混淆
- $() 不是所有linux系统都支持的方式, 兼容性较差, 但是不容易产生混淆
演示:
引用shell变量进行计算
注意 b是bc中定义的新变量, 与shell变量没有任何关系, 所以不可以在shell中获取b变量
进制转换
🚭 示例3:shell中非互动式的输入重定向运算(推荐)
介绍:
将计算表达式输出给bc去执行, 特点类似于文件中输入,可以输入多行表达式, 更加清晰
语法:
# 第一种方式
var_name=`bc [options] << EOF
第一行表达式1
第二行表达式2
...
EOF
`
# 第二种方式
var_name=$(bc [options] << EOF
第一行表达式1
第二行表达式2
...
EOF
)
var_name
这是Shell变量的名字
bc
执行bc的命令
EOF..EOF
输入流的多行表达式
含义: 将EOF中间多行表达式输入给到bc去执行,将bc执行的结果给到Shell变量var_name
演示:
如果有大量的数学计算,那么使用输入重定向就比较方便,因为数学表达式可以换行,写起来更加清晰。
🚬 小结
bc命令的作用
- 是一个任意精度计算器
bc有三种用法
-
在bc中进行互动式的数学运算
- bc -q 进入bc环境 直接输入一个算术表达式后回车 bc就会计算出结果输出
-
在shell中进行非互动式的bc管道运算
-
直接输出结果: echo “bc表达式” |bc [options]
-
赋值给变量: 变量名=$(echo “bc表达式” |bc [options])
-
-
在shell中非互动式的输入重定向bc运算
-
变量名=$(bc << EOF bc表达式 EOF ) 适合大量计算表达式
-
🚏 流程控制
🚀 流程控制:if else语句
目标:
- 1、能够使用if条件语句进行条件判断
介绍:
- if条件判断逻辑控制语句
🚬 if语法
多行写法语法
if 条件
then
命令
fi
可以将if语句放入一行语法
if 条件; then 命令; fi
🚬 if else 语法
if 条件
then
命令
else
命令
fi
🚬 if elif else 语法
if 条件1
then
命令1
elif 条件2
then
命令2
elif 条件3
then
命令3
……
else
命令N
fi
演示:
需求
提示"请输入你的考试成绩:" 接收用户输入一个成绩, 之后使用if else条件句判断 要求1: 小于 60 输出"不及格" 要求2: 大于等于70 并且 小于80 输出"中等" 要求3: 大于等于80 并且 小于90 输出"良好" 要求4: 大于等于90 并且 小于等于100 输出"优秀" 要求5: 以上不符合输出"成绩不合法" # 单行写法 条件后面加分号、命令后面加分号;、结束加分号 if ((1==1)); then echo "成立"; else echo "不成立"; fi;
control1.sh脚本代码
#!/bin/bash read -p "请输入你的考试成绩:" score if (( $score < 60 )); then echo "不及格" elif (( $score >= 60 && $score < 70 )); then echo "及格" elif (( $score >= 70 && $score < 80 )); then echo "中等" elif (( $score >= 80 && $score < 90 )); then echo "良好" elif (( $score >= 90 && $score <= 100 )); then echo "优秀" else echo "成绩不合法" fi
(())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( $a == $b ))
判断条件成立,进入 if,执行 then 后边的 echo 语句
🚬 小结
使用if条件语句进行条件判断
if 条件1
then
命令1
elif 条件2
then
命令2
elif 条件3
then
命令3
...
else
命令n
fi
🚄 if条件判断句的退出状态
目标:
- 1、理解什么是退出状态
- 2、能够查询每个命令的退出状态
介绍:
- linux任何命令的的执行都会有一个退出状态码, 无论是内置命令还是外部文件命令. 还是自定义的 Shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这就是命令的退出状态
- 大多数命令状态0代表成功, 非0代表失败. 也有特殊的命令,比如 diff 命令用来比较两个文件的不同,对于“没有差别”的文件返回 0,对于“找到差别”的文件返回 1,对无效文件名返回 2
- Shell 中,有多种方式取得命令的退出状态,其中
$?
是最常见的一种
演示:
🚬 退出状态和逻辑运算符的组合
Shell if 语句使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。
运算符 | 使用格式 | 说明 |
---|---|---|
&& 或 -a | 条件1 && 条件2 | 逻辑与运算符,当 条件1 和 条件2 同时成立时, 整个表达式才成立。 如果检测到 条件1 的退出状态为 0, 就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么, 整个表达式必然都是不成立的,检测了也是多此一举。 |
|| 或 -o | 条件1 || 条件2 | 逻辑或运算符,条件1 和 条件2 两个表 达式中只要有一个成立,整个表达式就成立。 如果检 测到 条件1 的退出状态为 1,就不会再检测 条件2 了,因为 不管 条件2 的退出状态是什么,整个表达式必然都是成立的, 检测了也是多此一举。 |
! | !条件 | 逻辑非运算符,相当于“取反”的效果。如果 条件 成立,那么整 个表达式就不成立;如果 条件 不成立,那么整个表达式就成立。 |
演示:
需求
创建itheima.txttouch itheima.txt # control2.sh脚本文件代码 #!/bin/bash read -p "请输入文件全名: " filename read -p "请输入数据:" data # -w 文件是否可写 -n 长度不能为0 并且-a (&&方式需要用到 [[]] 中) if [ -w $filename -a -n $data ] # 符号变量之间有空格 then echo $data # 将输入数据 输出 到文件中 echo $data > $filename echo "成功" else echo "失败" fi
test命令用于对文件或字符串进行检测,
-w
判断文件是否存在并且可写,-n
用于检测字符串是否非空, 后续讲解
$data > $filename
其中>
用于将内容输出到指定文件中去
🚬 小结
1、什么是退出状态
-
1、每个命令运行后都会返回一个退出状态值
-
2、大多数返回0代表成功, 非0 代表失败
2、查询每个命令的退出状态
- 常见命令
$?
🚒 Shell内置命令:test
目标:
-
1、理解test命令对整数比较测试
-
2、理解test命令对字符串
-
3、能够使用test命令对文件测试
介绍:
- Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
- 功能与[]一样
🚬 1、整数比较测试
语法:
if test 数字1 options 数字2
then
...
fi
options具体如下
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
演示:
control3.sh脚本代码
#!/bin/bash num1=1 num2=1 num3=2 echo "num1=${num1},num2=${num2},num3=${num3}" if test $num1 -eq $num2 then echo 'num1和num2两个数相等!' else echo 'num1和num2两个数不相等!' fi if test $num2 -eq $num3 then echo 'num2和num3两个数相等!' else echo 'num2和num3两个数不相等!' fi
🚬 2、字符串比较测试
语法:
参数 | 说明 |
---|---|
= 或 == | 等于, 等于返回0代表成功,否则返回1代表失败 |
!= | 不等于 |
\< | 小于 |
\> | 大于 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
演示:
control4.sh脚本代码
#!/bin/bash str1="itheima" str2="itcast" str3="" echo "str1=${str1},str2=${str2},str3=${str3}" if test $str1 = $str2 then echo 'str1和str2两个字符串相等' else echo 'str1和str2两个字符串不相等' fi if test $str1 \> $str2 then echo 'str1大于str2' else echo 'str1小于str2' fi if test -z $str2 then echo "str2字符串长度为0" else echo "str2字符串长度不为0" fi if test -z $str3 then echo "str3字符串长度为0" else echo "str3字符串长度不为0" fi
🚬 3、文件测试
语法:
参数 | 说明 |
---|---|
-e 文件名 | exists, 如果文件存在则为真 |
-r 文件名 | read,如果文件存在且可读则为真 |
-w 文件名 | write,如果文件存在且可写则为真 |
-x 文件名 | execute,如果文件存在且可执行则为真 |
-s 文件名 | string,如果文件存在且至少有一个字符则为真 |
-d 文件名 | directory,如果文件存在且为目录则为真 |
-f 文件名 | file,如果文件存在且为普通文件则为真 |
-c 文件名 | character,如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
演示:
查询control1.sh与control2.sh文件
control5.sh脚本代码
#!/bin/bash if test -w ./control1.sh then echo '文件已存在并且可写!' else echo '文件不存在或不可写!' fi if test -e ./control1.sh -a -e ./control2.sh then echo '两个文件都存在!' else echo '可能有一个或两个文件不存在' fi
Shell提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:“!“最高,”-a"次之,”-o"最低, 语法
test 条件1 -o 条件2 -a 条件3 ...
🚬 小结
1、test命令对整数比较测试
- test 整数1 options 整数2
- options: lt le gt ge eq ne
2、test命令对字符串比较测试
- test 变量1 options 变量2
- options: > < != = ==
< >
需要转义
3、使用test命令对文件测试
- test options 文件路径字符串
- options: -w -r -e -x -s -d
注意: test命令与[] 功能一样