基础shell小技巧002

1. 使用if-then语句

如果之前用过其他编程语言的if-then语句,那么这种形式可能会让你有点儿困惑。在其他编程语言中,if语句之后的对象是一个等式,其求值结果为TRUE或FALSE。但bash shell的if语句并非如此。

重点:bash shell的if语句会运行if之后的命令。如果该命令的退出状态码为0(命令成功运行),那么位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,则then部分的命令不会被执行,bash shell会接着处理脚本中的下一条命令。fi语句用来表示if-then语句到此结束。

# !/bin/bashtestuser=NoSuchUser
#
if grep $testuser /etc/passwd
thenecho "The script files in the home directory of $testuser are:"ls /home/$testuser/*.shecho
elseecho "The user $testuser does not exist on this system."echo
fi

2. test命令

test命令可以在if-then语句中测试不同的条件。如果test命令中列出的条件成立,那么test命令就会退出并返回退出状态码0。这样if-then语句的工作方式就和其他编程语言中的if-then语句差不多了。如果条件不成立,那么test命令就会退出并返回非0的退出状态码,这使得if-then语句不会再被执行。

test命令的格式非常简单:

test condition

demo:

# !/bin/bash
my_variable=""if test $my_variable
thenecho "The my_variable variable has content and returns a True."echo "The my_variable variable content is: $my_variable"
elseecho "The my_variable variable doesn't have content,"echo "and returns a False."
fi

bash shell提供了另一种条件测试方式,无须在if-then语句中写明test命令:

if [ condition ]
thencommands
fi
# 方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须留有空格,否则就会报错。

test命令和测试条件可以判断3类条件:

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

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

数值条件测试可用于数字和变量。来看一个例子:

# !/bin/bash
value1=10
value2=11
#
if [ $value1 -gt 5 ]
thenecho "The test value $value1 is greater than 5."
fi
#
if [ $value1 -eq $value2 ]
thenecho "The values are equal."
elseecho "The values are different."
fi

注意:对于条件测试,bash shell只能处理整数。尽管可以将浮点值用于某些命令(比如echo),但它们在条件测试下无法正常工作。

2.2 字符串比较

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

字符串的相等和不等条件不言自明,很容易看出两个字符串值是否相同:

# !/bin/bashtestuser=christine
#
if [ $testuser = christine ]
thenecho "The testuser variable contains: christine"
elseecho "The testuser variable contains: $testuser"
fi

要测试一个字符串是否大于或小于另一个字符串就开始变得棘手了。使用测试条件的大于或小于功能时,会出现两个经常困扰shell程序员的问题。·大于号和小于号必须转义,否则shell会将其视为重定向符,将字符串值当作文件名。

# !/bin/bashstring1=soccer
string2=zorbfootballif [ $string1 \> $string2 ]
thenecho "$string1 is greater than $string2"
elseecho "$string1 is less than $string2"
fi

-n和-z可以很方便地用于检查一个变量是否为空:

# !/bin/bash
string1=Soccer
string2=''
#
if [ -n $string1 ]
thenecho "The string '$string1' is NOT empty"
elseecho "The string '$string1' IS empty"
fi
#
if [ -z $string2 ]
thenecho "The string '$string2' IS empty"
elseecho "The string '$string2' is NOT empty"
fi
#
if [ -z $string3 ]
thenecho "The string '$string3' IS empty"
elseecho "The string '$string3' is NOT empty"
fi

2.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测试会检查指定的目录是否存在于系统中。如果打算将文件写入目录或是准备切换到某个目录,那么先测试一下总是件好事:

# !/bin/bashjump_directory=$(pwd)
#
if [ -d $jump_directory ]
thenecho "The $jump_directory directory exists."cd $jump_directoryls
elseecho "The $jump_directory directory does NOT exist."
fi

3. 复合条件测试

if-then语句允许使用布尔逻辑将测试条件组合起来。可以使用以下两种布尔运算符。

  • [ condition1 ] && [ condition2 ] :第一种布尔运算使用布尔运算符AND来组合两个条件。要执行then部分的命令,两个条件都必须满足。
  • [ condition1 ] || [ condition2 ]:第二种布尔运算使用OR布尔运算符来组合两个条件。如果任意条件为真,那么then部分的命令就会执行。
# !/bin/bash
echo $HOME
if [ -d $HOME ] && [ -w $HOME/newfile ]
thenecho "The file exists and you can write to it."
#
elseecho "You cannot write to the file."
#
fi

4. if-then的高级特性

bash shell还提供了3个可在if-then语句中使用的高级特性。·

  • 在子shell中执行命令的单括号。

  • 用于数学表达式的双括号。

  • 用于高级字符串处理功能的双方括号。

接下来将详细描述各个特性。

4.1 使用单括号

在bash shell执行command之前,会先创建一个子shell,然后在其中执行命令。如果命令成功结束,则退出状态码(参见第11章)会被设为0,then部分的命令就会被执行。如果命令的退出状态码不为0,则不执行then部分的命令。来看一个使用子shell进行测试的例子:

# !/bin/bashecho $BASH_SUBSHELL
if (echo $BASH_SUBSHELL)
thenecho "The subshell command operated successfully."
#
elseecho "The subshell command was NOT successful."
#
fi

4.2 使用双括号

双括号命令允许在比较过程中使用高级数学表达式。test命令在进行比较的时候只能使用简单的算术操作。双括号命令提供了更多的数学符号,这些符号对有过其他编程语言经验的程序员而言并不陌生。双括号命令的格式如下:

(( expression ))

双括号命令符号:

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

双括号命令既可以在if语句中使用,也可以在脚本中的普通命令里用来赋值:

# !/bin/bashval1=10
#
if (( $val1 ** 2 > 90 ))
then(( val2 = $val1 ** 2 ))echo "The square of $val1 is $val2,"echo "which is greater than 90."
#
fi

4.3 使用双括号

双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:

[[ expression ]]

expression可以使用test命令中的标准字符串比较。除此之外,它还提供了test命令所不具备的另一个特性——模式匹配。

在进行模式匹配时,可以定义通配符或正则表达式匹配字符串:

# !/bin/bash
echo $BASH_VERSIONif [[ $BASH_VERSION == 4.* ]]
thenecho "You are using the Bash Shell version 5 series."
fi

5. case命令

有了case命令,就无须再写大量的elif语句来检查同一个变量的值了。case命令会采用列表格式来检查变量的多个值:

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

case命令会将指定变量与不同模式进行比较。如果变量与模式匹配,那么shell就会执行为该模式指定的命令。你可以通过竖线运算符在一行中分隔出多个模式。星号会捕获所有与已知模式不匹配的值。下面是一个将if-then-else程序转换成使用case命令的例子:

# !/bin/bashuser="tim"case $user in
rich | christine)echo "Welcome $user"echo "Please enjoy your visit.";;
barbara | tim)echo "Hi there, $user"echo "We're glad you could join us.";;
testing)echo "Please log out when done with test.";;
*)echo "Sorry, you are not allowed here."
esac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive 动态分区-动态分区数量太多也会导致效率下降只设置非严格模式也能执行动态分区

hive 动态分区-动态分区数量太多也会导致效率下降&只设置非严格模式也能执行动态分区 结论 在非严格模式下不开启动态分区的功能的参数&#xff08;配置如下&#xff09;&#xff0c;同样也能进行动态分区数据写入&#xff0c;目测原因是不严格检查SQL中是否指定分区或者…

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 、QLabel。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是…

yolov5添加SimAM注意力机制(yolov7同理)

SimAM注意力机制简介 关于SIMAM注意力机制的原理这里不再详细解释,这篇发在Proceeddings of the 38th Internation Conference on Machine Learning.论文参考如下论文链接here   yolov5中添加SimAM注意力机制 注意力机制分为接收通道数和不接受通道数两种。这次属于不接受通…

数据库相关知识2

数据库知识2 关系完整性 数据完整性 指的是数据库中的数据的准确性和可靠性 实体完整性约束&#xff1a; 目的&#xff1a; 在表中至少有一个唯一的 标识&#xff0c;主属性字段中&#xff0c;不为空&#xff0c;不重复 主键约束&#xff1a;唯一 不重复 不为空 primary k…

c语言实现堆

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树1、树的概念2、树的相关概念3、树的表示 二、二叉树1、二叉树概念2、特殊的二叉树3、二叉树的性质4、二叉树的顺序结构5、二叉树的链式结构 三、堆(二叉树…

C# textBox1.Text=““与textBox1.Clear()的区别

一、区别 textbox.Text "" 和 textbox.Clear() 都可以用于清空文本框的内容&#xff0c;但它们之间有一些细微的区别。 textbox.Text "": 这种方式会将文本框的 Text 属性直接设置为空字符串。这样会立即清除文本框的内容&#xff0c;并将文本框显示为空…

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串&#xff0c;原地替换思考 剑指 Offer 05. 替换空格 题目链接&#xff1a;剑指 Offer 05. 替换空格 题目内容&#xff1a; 这是一道简单题&#xff0c;理解题意&#xff0c;就是将字符串s中的空格…

unity 提取 字符串中 数字 修改后返回 字符串

参考博主&#xff1a;unity 提取字符串数字修改后返回字符串_unity string提取数字_lvcoc的博客-CSDN博客 正数和浮点数的 正则表达式 //正则表达式//const string pattern "\d";//表达1位或多位的整数数字 const string pattern "\d\.\d";//表达1位或…

拼多多开放平台的API接口可以获取拼多多电商数据。以下是API接口流程

使用拼多多开放平台的API接口可以获取拼多多电商数据。以下是一般的API接口流程&#xff1a; 1. 注册开发者账号&#xff1a;首先&#xff0c;您需要在拼多多开放平台注册一个开发者账号。通过开发者账号&#xff0c;您可以获得API密钥和其他必要的信息。 2. 鉴权与认证&…

数据结构1

数据结构是计算机科学中存储和组织数据的一种方式&#xff0c;它定义了数据的表示方式和对数据进行操作的方法&#xff0c;常见的数据结构包括数组、栈、链表、队列、树、图等。 目录 一、常见的数据结构 1.数组 2.栈 3.队列 4.链表 5.树 6.图 一、常见的数据结构 1.数…

自动设置服务器全教程

亲爱的爬虫探险家&#xff01;在网络爬虫的世界里&#xff0c;自动设置代理服务器是一个非常有用的技巧。今天&#xff0c;作为一家代理服务器供应商&#xff0c;我将为你呈上一份轻松实用的教程&#xff0c;帮助你轻松搞定爬虫自动设置代理服务器。 一、为什么需要自动设置代…

【MongoDB】Springboot中MongoDB简单使用

1. docker安装MongoDB 拉取镜像 docker pull mongo创建容器 docker run -di --name mongo-service --restartalways -p 27017:27017 -v ~/data/mongodata:/data mongo2. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactI…

前端如何走通后端接口

0 写在前面 现在基本都是前后端分离的项目了&#xff0c;那么前端小伙伴如何获取后端小伙伴接口呢&#xff1f; 1 条件 同一WiFi下&#xff0c;让后端小伙伴分享出自己的ip地址&#xff1a; 步骤1:winr调出运行界面 步骤2&#xff1a;cmd调出命令行窗口 步骤3&#xff1a;…

JavaScript用indexOf()在字符串数组中查找子串时需要注意的一个地方

一、遇到问题 在 继续更新完善&#xff1a;C 结构体代码转MASM32代码 中&#xff0c;由于结构体成员中可能为数组类型的情况&#xff0c;因此我们在提取结构体成员信息的过程中&#xff0c;需要检测结构体成员名称字符串中是否包括 []&#xff0c;如果包括那么我们要截取[前面…

Glog安装与使用

安装 脚本 #!/bin/bash git clone https://github.com/google/glog.git cd glog git checkout v0.4.0 mkdir build && cd build cmake .. make -j4 echo "your password" | sudo -S make install使用 main.cc #include <glog/logging.h>int main(i…

Python爬虫分布式架构 - Redis/RabbitMQ工作流程介绍

在大规模数据采集和处理任务中&#xff0c;使用分布式架构可以提高效率和可扩展性。本文将介绍Python爬虫分布式架构中常用的消息队列工具Redis和RabbitMQ的工作流程&#xff0c;帮助你理解分布式爬虫的原理和应用。 为什么需要分布式架构&#xff1f; 在数据采集任务中&#…

android2022配置opencv4android480

1&#xff0c;安装android studio2022。 2&#xff0c;下载OPENCV4ANDROID&#xff0c;解压到任意盘中。 3&#xff0c;File->New->New Project&#xff0c;选择Empty Views Activity。再选择语言&#xff0c;本文选择JAVA。 4&#xff0c;File->New->Import Modu…

麒麟系统开启root账户及自动登陆

1.首先我们通过“开始菜单t”快捷键打开命令行页面&#xff0c;然后我们通过 cd /usr/share/lightdm/lightdm.conf.d/进入对应系统目录。之后我们通过ls命令查看目录中的文件&#xff0c;找到95-ukui-greeter.conf这个文件。 2.之后我们通过命令 sudo vim 95-ukui-greeter.c…

【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; vector 1. 前言2. 熟悉vector的接口函数2.1 vec…

Redis Replication

Redis Replication 1、前言 在单节点搞事情, 存在的问题包括存量问题和增量问题两类, 解决方案就是1个不行上N个, 做到单机维度宕机但服务维度是可用的。 1.1 存量问题 如果目前的单节点QPS满足(也就是综合瓶颈还没达到), 那么只有宕机能影响到。如果业务量不大, 又是出于成…