Shell之计算命令、流程控制、函数

😹 作者: 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6j08DAy-1667046196666)(assets/image-20200703102043699.png)]

获取计算结果赋值给新变量语法

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5YyG6wp-1667047403176)(assets/image-20200703112053690.png)]

🚬 小结

(())的用法:

  • 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 中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwGvlkPq-1667047403178)(assets/image-20200703113800668.png)]

    输出建议使用(())

案例演示:

需求

# 计算变量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}"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30zNzoiT-1667047403179)(assets/image-20200703114726267.png)]

🚬 小结

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]"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWwn415B-1667047403179)(assets/image-20200703135351633.png)]

🧭 执行整数表达式命令总结

执行整数表达式命令的总结, 推荐使用哪个:

  • 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

选项说明
-hhelp,帮助信息
-vversion,显示命令版本信息
-lmathlib, 使用标准数学库, 例如使用内置函数就需要使用这个参数
-iinteractive, 强制交互
-wwarn, 显示 POSIX 的警告信息
-sstandard, 使用 POSIX 标准来处理
-qquiet, 不显示欢迎信息

默认使用bc命令后回车会有很多欢迎信息, 可以使用 bc -q 回车后不会有欢迎信息

参数

文件 指定包含计算任务的文件

🚭 示例1:演示bc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRdHdk8m-1667135764459)(Shell%E7%AC%AC%E4%B8%89%E5%A4%A9-%E7%AC%94%E8%AE%B0.assets/image-20221030203455407.png)]

🚭 示例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系统都支持的方式, 兼容性较差, 但是不容易产生混淆

演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4ma4Gdh-1667135764461)(assets/image-20200703154646821.png)]

引用shell变量进行计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jC6oleiS-1667135764462)(assets/image-20200703155152427.png)]

注意 b是bc中定义的新变量, 与shell变量没有任何关系, 所以不可以在shell中获取b变量

进制转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3bTJbps-1667135764462)(assets/image-20200703155732347.png)]

🚭 示例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 语句

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzDFt6jn-1667138601478)(assets/image-20200703165220020.png)]

🚬 小结

使用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 中,有多种方式取得命令的退出状态,其中 $? 是最常见的一种

演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9j0fWJcR-1667138601479)(assets/image-20200703172613295.png)]

🚬 退出状态和逻辑运算符的组合

Shell if 语句使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。

运算符使用格式说明
&& 或 -a条件1 && 条件2逻辑与运算符,当 条件1 和 条件2 同时成立时,
整个表达式才成立。 如果检测到 条件1 的退出状态为 0,
就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么,
整个表达式必然都是不成立的,检测了也是多此一举。
|| 或 -o条件1 || 条件2逻辑或运算符,条件1 和 条件2 两个表
达式中只要有一个成立,整个表达式就成立。 如果检
测到 条件1 的退出状态为 1,就不会再检测 条件2 了,因为
不管 条件2 的退出状态是什么,整个表达式必然都是成立的,
检测了也是多此一举。
!!条件逻辑非运算符,相当于“取反”的效果。如果 条件 成立,那么整
个表达式就不成立;如果 条件 不成立,那么整个表达式就成立。

演示:

需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jGExHQFO-1667138601479)(Shell%E7%AC%AC%E4%B8%89%E5%A4%A9-%E7%AC%94%E8%AE%B0.assets/image-20221030213255182.png)]

创建itheima.txt

touch 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 其中 > 用于将内容输出到指定文件中去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWU853Bk-1667138601480)(assets/image-20200703183031637.png)]

🚬 小结

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小于等于则为真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mcS5GIO-1667138601480)(Shell%E7%AC%AC%E4%B8%89%E5%A4%A9-%E7%AC%94%E8%AE%B0.assets/image-20221030214006383.png)]

演示:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zNuk3rpC-1667138601481)(assets/image-20200704063911230.png)]

🚬 2、字符串比较测试

语法:

参数说明
= 或 ==等于, 等于返回0代表成功,否则返回1代表失败
!=不等于
\<小于
\>大于
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l460sIyO-1667138601481)(Shell%E7%AC%AC%E4%B8%89%E5%A4%A9-%E7%AC%94%E8%AE%B0.assets/image-20221030214157377.png)]

演示:

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


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1af9UHcl-1667138601482)(assets/image-20200704114310717.png)]

🚬 3、文件测试

语法:

参数说明
-e 文件名exists, 如果文件存在则为真
-r 文件名read,如果文件存在且可读则为真
-w 文件名write,如果文件存在且可写则为真
-x 文件名execute,如果文件存在且可执行则为真
-s 文件名string,如果文件存在且至少有一个字符则为真
-d 文件名directory,如果文件存在且为目录则为真
-f 文件名file,如果文件存在且为普通文件则为真
-c 文件名character,如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sw009GQY-1667138601482)(Shell%E7%AC%AC%E4%B8%89%E5%A4%A9-%E7%AC%94%E8%AE%B0.assets/image-20221030214308965.png)]

演示:

查询control1.sh与control2.sh文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJBXDijh-1667138601483)(assets/image-20200704074537077.png)]

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 ...


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xjdwmjs4-1667138601483)(assets/image-20200704074322642.png)]

🚬 小结

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命令与[] 功能一样

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gh-xiaohe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值