shell之使用结构化命令----if-then、test命令、case命令

文章目录

  • 使用if-then语句
  • if-then-else语句
  • 嵌套if
  • test命令
  • 复合条件测试
  • if-then的高级特性
  • case命令

结构化命令允许你改变shell脚本的正常执行流。

使用if-then语句

bash shell的if语句会运行if行定义的那个命令。如果该命令行的退出码是0(该命令执行成功),位于then部分的命令就会被执行。如果该命令的退出状态不是0,那么then部分的命令就不会被执行,bash shell会继续执行脚本的下一个命令。
if-then语句不能测试跟命令退出码无关的条件

#!/bin/bash
if date
then
  echo "it worked"
fi

在这里插入图片描述
如果if语句后的命令运行出错,错误消息依然会显示再脚本的输出中。
在then部分,可以用多个命令。

if-then-else语句

当if语句的命令返回退出状态吗是0时,then的部分中的命令会被执行,跟普通的if-then语句一样。当if语句中的命令返回非0退出状态码时,bash shell会执行else部分中的命令。else部分也可包含多条命令。fi语句说明else部分结束了。

嵌套if

if command1
then
	commands
elif command2
then
	commands
elif command3
then
	comands
fi

test命令

test命令提供了在if-then语句中测试不同条件的途径,如果test命令中列出的条件成立,test命令就会推出并返回推出状态码0,;如果条件不成立,test命令就会推出并返回推出状态码1.

if test condition
then
	commands
fi

bash shell提供了另一种在if-then语句中声明test的办法:

if [ condition ]
then
	commands
fi

必须在左括号右侧和右括号左侧加一个空格,否则会报错(经本人测试,在左括号左侧也要加一个空格)
test命令可以判断三类条件

  • 数值比较

  • 字符串比较

  • 文件比较

  • 1.数值比较

比较 描述 类似于
n1 -eq n2 检查n1是否与n2相等 ==
n1 -ge n2 检查n1是否大于等于n2 >=
n1 -gt n2 检查n1是否大于n2 >
n1 -le n2 检查n1是否小于或等于n2 <=
n1 -lt n2 检查n1是否小于n2 <
n1 -ne n2 检查n1是否不等于n2 !=

不能在test语句中使用浮点数

  • 2.字符串比较
    比较|描述
    –|--
    str1 = str2|检查str1是否和str2相同
    str1 != str2|检查str1是否和str2不同
    str1 < str2|检查str1是否比str2小
    str1 > str2|检查str1是否比str2大
    -n str1|检查str1的长度是否为非0
    -z str1|检查str1的长度是否为0
    =、!=很容易。大于小于需要注意的事项:
  • 大于小于符号必须转义,否则shell会把它们当做重定向符号而把字符串值当做文件名;
  • 大于小于顺序和sort命令所采用的不同。在test命令中大写字母会被当成小于小写字母的,而在用sort命令排序时,小写字母会先出现。

如果一个字符串变量未在shell脚本中定义过,该字符串的程度仍然为0,尽管它并未被定义过。

  • 3.文件比较
比较 描述
-d file 检查file是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件
-r file 检查file是否存在并可读
-s file 检查file是否存在且非空
-w file 检查file是否存在且可写
-x file 检查file是否存在且可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

检查目录
-d测试会检查指定的文件名是否在系统上并以目录形式存在。
shell之使用结构化命令----if-then、test命令、case命令_第1张图片

复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:

  • [ condition1 ] && [ condition2 ]
  • [ condition1 ] || [ condition2 ]
#!/bin/bash
echo $HOME
if [ -d $HOME  ] && [ -w $HOME/testing  ]
then
  echo "The file exists and you can write to it"
else
  echo "You cannot write to the file"
fi

shell之使用结构化命令----if-then、test命令、case命令_第2张图片

if-then的高级特性

1.使用双圆括号
双圆括号允许你将高级数学表达式放入比较式中。test命令只允许在比较中进行简单的算数操作。

符号 描述
val++ 后增
val- - 后减
++val 先增
- -val 先减
逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或

shell之使用结构化命令----if-then、test命令、case命令_第3张图片
字符串比较那里的大于号小于号必须要使用转义,双圆括号中则不需要。
2.使用双方括号
双方括号命令提供了针对字符串比较的高级特性:
[[ expression ]]
双方括号里的expression使用了test命令中采用的标准字符串进行比较。但他提供了test命令没有提供的另一特性----模式匹配。在模式匹配中可以定义一个正则表达式来匹配字符串值:
shell之使用结构化命令----if-then、test命令、case命令_第4张图片

case命令

用case命令,不断检查相同变量值,而不用写很多elif语句:
shell之使用结构化命令----if-then、test命令、case命令_第5张图片

你可能感兴趣的:(shell)