当前位置: 首页 > news >正文

【Linux】结构化命令

结构化命令structured command:允许脚本根据条件跳过部分命令,改变执行流程。

1、if-then语句

格式1:

if command

then

   commands

fi

格式2:

if command; then

   commands

fi

运行if之后的command命令,如果它的退出状态码是0(该命令成功执行),那么就执行then里面的命令;如果是其它值,则执行脚本中的下一条命令。fi语句用来表示if-then语句到此结束。

#!/bin/bash
if pwd
thenecho "查看当前路径成功!"
fi

 

2、if-then-else语句

格式:

if command

then

   commands

else

   commands

fi 

3、嵌套if语句

 通过使用嵌套的if语句,可以在shell脚本中检查多种条件

#!/bin/bash
testuser=ln
if grep $testuser /etc/passwd
thenecho "用户$testuser存在。"echo
elseecho "用户$testuser不存在。"if ls -d /home/$testuser/thenecho "但是该用户有个路径。"fi
fi
echo "脚本运行完毕!"

4、elif语句

格式:

if command1

then

   commands

elif command2

then

   commands

fi

#!/bin/bash
testuser=ln
if grep $testuser /etc/passwd
thenecho "用户$testuser存在。"echo
elif ls -d /home/$testuser/
thenecho "用户$testuser不存在。"echo "但是该用户有个路径。"
fi
echo "脚本运行完毕!"

5、test命令

test命令可以在if-then语句中测试不同的条件,如果test命令中列出的条件成立,那么test命令就会退出并返回退出状态码0;若条件不成立,test命令就会退出并返回非0的退出状态码。

格式:test condition

if test condition

then

   commands

fi

 如果不写test命令的condition条件,那它会以非0的退出状态码退出并执行else部分的代码块。

#!/bin/bash
if test
thenecho "111"
elseecho "222"
fi

 加上test命令的condition条件

#!/bin/bash
var1="Full"if test $var1
thenecho "111"
elseecho "222"
fi

 如果test命令的condition返回非0退出状态码

#!/bin/bash
var1=""if test $var1
thenecho "111"
elseecho "222"
fi

6、使用方括号代替test命令

可以通过使用方括号定义测试条件注意:第一个方括号之后和第二个方括号之前必须留有空格,否则会报错。 

格式:

if [ condition ]

then

   commands

fi

test命令中的condition和测试条件里的condition可以判断如下3类条件:

  1. 数值比较
  2. 字符串比较
  3. 文件比较

数值比较

常见数值比较如下表格所示:

n1 -eq n2equal,是否等于
n1 -ne n2not equal,是否不等于
n1 -gt n2greater than,是否大于
n1 -lt n2less than,是否小于
n1 -le n2less equal,是否等于小于
n1 -ge n2greater equal,是否大于等于
#!/bin/bash
var1=10
var2=9if [ $var1 -gt 10 ]
thenecho "good!"
elseecho "not good!"
fiif [ $var1 -eq $var2 ]
thenecho "它们相等!"
elseecho "它们不等!"
fi

 字符串比较

字符串比较
str1 = str2检查str1是否和str2相同
str1 != str1检查str1是否和str2不同
str1 < str2检查str1是否小于str2
str1 > str2检查str1是否大于str2
-n str1检查str1的长度是否不为0
-z str1检查str1的长度是否为0

在比较字符串的相等性时,比较测试会将所有的标点大小写都考虑在内。 

#!/bin/bash
#字符串相等或不等
test=ning
if [ $test = ning ]
thenecho "111"
elseecho "222"
fiif [ $test != Ning ]
thenecho "333"
elseecho "444"
fi

在比较字符串的大小时,大于号、小于号必须转义,否则shell会将它们看成重定向符号,将字符串的值当做文件名;另外,大于和小于顺序与sort命令所采用的不同。

 在比较测试中,大写字母是小于小写字母的,但sort则相反,当你使用sort排序时,小写字母会排在前面。这是因为在比较测试中,使用的是Unicode顺序,根据每个字符的Unicode编码值来决定排序结果;sort命令使用的是系统语言环境设置中定义的排序顺序,对于英语,语言设置环境指定了小写字母在大写字母之前。

#!/bin/bash
#字符串的大于小于比较
test=yue
test1=ning
if [ $test \> $ning ]
thenecho "111"
elseecho "222"
fi#字符串的大小写比较
var1=Ning
var2=ning
if [ $var1 \> $var2 ]
thenecho "333"
elseecho "444"
fi

字符串大小

空变量和未初始化的变量会对shell脚本测试造成灾难性的影响,如果不确定变量的内容,最好在将其用于数值或字符串比较之前先通过 -n-z 来判断一下变量是否为空。

#!/bin/bash
string1="yue"
string2=""#判断string1的长度是否不为0
if [ -n $string1 ]
thenecho "111"
elseecco "222"
fi#判断string2的长度是否为0
if [ -z $string2 ]
thenecho "333"
elseecho "444"
fi#判断未定义的string3的长度是否为0
if [ -z $string3 ]
thenecho "555"
elseecho "666"
fi

文件比较

文件比较是shell编程中最为强大且使用最多的比较形式,它允许测试Linux文件系统中文件和目录的状态。

文件比较功能
-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是否存在且默认组与当前用户相同
file -nt file2检查file1是否比file2新(比较创建日期)
file -ot file2检查file1是否比file2旧(比较创建日期)
#!/bin/bash
#举例:检查指定对象是否为文件
object_name=$HOME
echo
echo "目标已经确认:$object_name."
echoif [ -e $object_name ]
thenecho "目标存在!"if [ -f $object_name ]thenecho "目标不仅存在,而且还是个文件。"elseecho "目标存在,但它是目录,不是文件。"fielseecho "目标不存在!"
fi

比较两个文件的创建日期时,-nt-ot 都不会先检查文件是否存在,所以为了防止这一点,在比较前可以先判断两个文件是否已存在。 

#!/bin/bash
#比较两个文件的创建日期if [ $HOME/Downloads/test1.sh -nt $HOME/Downloads/test2.sh ]
thenecho "test1.sh更新!"
elseecho "test2.sh更新!"
fi

声明:以上内容均是学习内容,非原创。


http://www.mrgr.cn/news/80356.html

相关文章:

  • 前端项目初始化搭建(二)
  • 从 Router 到 Navigation:HarmonyOS 路由框架的全面升级与迁移指南
  • 流程引擎Activiti性能优化方案
  • Y3编辑器教程5:触发器进阶使用(镜头、UI、表格、函数库、排行榜、游戏不同步)
  • Linux+Docker onlyoffice 启用 HTTPS 端口支持
  • union find算法 c++
  • soul大数据面试题及参考答案
  • linux sysrq的使用举例
  • Vue组件相关记录
  • 【CSS in Depth 2 精译_079】第 13 章:渐变、阴影与混合模式概述 + 13.1:CSS 渐变效果(一)——使用多个颜色节点
  • python请求SSL问题
  • 深入分析 Java 中的 NoSuchMethodException 异常及解决方法
  • Gitlab ci/cd 从0-1持续集成持续发布前端
  • Android显示系统(11)- 向SurfaceFlinger申请Surface
  • Transformer记录Attention is all you need
  • 怎么写英语作文(个人笔记)
  • Unity中Mesh重叠顶点合并参考及其应用
  • chromedriver可运行的docker环境
  • etcd常见运维事件
  • 【electron】electron forge + vite + vue + electron-release-server 自动更新客户端