Linux shell编程学习笔记9:字符串运算 和 if语句

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。

上期学习笔记中我们研究了字符串数据的使用,今天我们研究字符串运算,为了应用实例进行讲解,我们同时研究了进行判断的时候经常使用的if语句。

一、常用字符串运算符

运算符 说明
= 检测两个字符串是否相等,相等返回 0(true),否则返回1(false)。
!= 检测两个字符串是否不相等,不相等返回 0(true),否则返回1(false)。
-z 检测字符串长度是否为0,为0返回 0(true),否则返回1(false)。
-n 检测字符串长度是否不为 0,不为 0 返回 0(true),否则返回1(false)。
$ 检测字符串是否不为空,不为空返回0(true),否则返回1(false)。

二、if语句

与C、C++、Pascal等其它编程语言相似,在 Linux Shell 编程中,同样需要进行根据条件进行流程控制,也提供了if、for、while、until等语句。

因为我们在下面进行字符串运算的实例讲解时需要使用流程控制来演示,所以今天我们先看看在进行判断的时候经常使用的if语句。

Linux Shell 脚本编程中 使用的 if 语句形式 与C、C++、Pascal等语言中还是较大差别的。

Linux Shell 脚本编程中 if 语句主要有以下几种形式和组合。

(一) if - then -fi 语句

bash 复制代码
if [condition]
then
    符合 condition 的执行语句
fi

(二) if -then-else-fi 语句

bash 复制代码
if [condition]
then
    符合 condition 的执行语句
else
    不符合 condition 的执行语句
fi

写起来是不是感觉有点麻烦?

所以Linux Shell 脚本编程中还提供了两种简写格式

(三) if ;- then -fi 语句

也就是将 then 与 if 写在同一行,这时]后面需要添加分号,例如:

bash 复制代码
if [condition]; then
    符合 condition 的执行语句
fi

(四)if -then-elif-then-fi 语句

将 else if 简写为 elif,elif 后面也要有 then来配对,如下所示:

bash 复制代码
if [condition1]
then
    符合 condition1 的执行语句
elif [condition2]
then
    符合 condition2 的执行语句
else 
    不符合 condition1 和 condition2 的执行语句
fi

或者

bash 复制代码
if [condition1]
then
    符合 condition1 的执行语句
elif [condition2]; then
    符合 condition2 的执行语句
else 
    不符合 condition1 和 condition2 的执行语句
fi

请注意两点:

1.结尾是将 if 倒过来写 fi 作为结束标志,而不是endif。

2.condition(条件表达式)要放在方括号之间,并且运算符和运算对象之间要有空格分隔。

例如, [a=b] 这种写法是错误的,因为a=b是赋值语句,

要进行比较必须写成 [ $a = $b ]。

网上有些教程说: 条件表达式要放在方括号之间,并且要有空格间隔,即 [$s1] 要写为 [ $s1 ]。

但在下面第三部分的实例中,我们写为 [ $s1] ,仍能执行并获得正确的结果。。

三、字符串操作实例

(一)字符串是否相等

user @host: ~ ++$s1='ab'++

user @host: ~ $++s2='cd'++

user @host: ~ $++s3='ab'++

user @host: ~ $++r=`expr $s1 = $s2`++

user @host: ~ $++echo $r++

0

user @host: ~ $++r=`expr $s1 = $s3`++

user @host: ~ $++echo $r++

1

user @host: ~ $

注意:上面的命令中使用的反引号,不是单引号

从上例中,我们可以看到:

由于变量s1和s2不相等,所以$s1 = $s2 的比较结果是0。

由于变量s1和s3相等,所以$s1 = $s3 的 比较结果是1。

(二)字符串是否不相等

user @host: ~ ++$s1='ab'++

user @host: ~ $++s2='cd'++

user @host: ~ $++s3='ab'++

user @host: ~ $++r=`expr $s1 != $s2`++

user @host: ~ $++echo $r++

1

user @host: ~ $++r=`expr $s1 != $s3`++

user @host: ~ $++echo $r++

0

user @host: ~ $

注意:上面的命令中使用的反引号,不是单引号

从这个实例中,我们可以看到:

由于变量s1和s2不相等,所以$s1 != $s2 的比较结果是1。

由于变量s1和s3相等,所以$s1 != $s3 的比较结果是0。

字符串是否不相等 实例的比较结果跟前面字符串是否相等 的实例中正好相反。

(三)检测字符串长度是否为0

user @ host: ~ $ ++s1="ab"++

user @ host: ~ $ ++if [ -z $s1 ]; then++

> ++echo "-z $s1 ==0"++

> ++else++

> ++echo "-z $s1 !=0"++

> ++fi++

-z ab !=0

user @ host: ~ $ ++s1=""++

user @ host: ~ $ ++if [ -z $s1 ]; then++

> ++echo "-z $s1 == 0"++

> ++else++

> ++echo "-z $s1 != 0"++

> ++fi++

-z == 0

user @ host: ~ $

由于我们还没有研究到脚本文件,在上面的实例中,我们是通过命令行输入了两个命令序列,

第一个命令序列是

bash 复制代码
s1="ab"
if [ -z $s1 ]; then
       echo "-z $s1 ==0"
else
      echo "-z $s1 !=0"
fi

由于s1="ab",它的长度是2,所以执行结果为:

-z ab !=0

第二个命令序列是

bash 复制代码
s1=""
if [ -z $s1 ]; then
       echo "-z $s1 ==0"
else
      echo "-z $s1 !=0"
fi

由于s1="",它的长度是0,所以执行结果为:

-z == 0

(四)检测字符串长度是否不为0

把上面两段命令序列中的 -z $s1 改为 -n $s1,那么执行的结果就是下面这样的:

user @ host: ~ $ ++s1="ab"++

user @ host: ~ $ ++if [ -n $s1 ]++

>++then++

>++echo "-n $s1 == 0"++

> ++else++

>++echo "-n $s1 != 0"++

> ++fi++

-n ab == 0

user @ host: ~ $ ++s1=""++

user @ host: ~ $++if [ -n $s1 ]++

>++then++

>++echo "-n $s1 == 0"++

>++else++

>++echo "-n $s1 != 0"++

>++fi++

-n == 0

user @ host: ~ $

(五)检测字符串是否不为空

user @ host: ~ $ ++s1="ab"++

user @ host: ~ $ ++if [ $s1 ]; then++

> ++echo "$s1 != null"++

> ++else++

> ++echo "$s1 == null"++

> ++fi++

ab != null

user @ host: ~ $ ++s1=""++

user @ host: ~ $ ++if [ $s1]++

> ++then++

> ++echo "$s1 != null"++

> ++else++

> ++echo "$s1 == null"++

> ++fi++

== null

user @ host: ~ $

在上面的实例中,我们是通过命令行输入了两个命令序列,

第一个命令序列是

bash 复制代码
s1="ab"
if [ $s1 ]; then
  echo "$s1 != null"
else
 echo "$s1 == null"
fi

由于s1="ab",其值不为空,所以执行结果为:

ab != null

第二个命令序列是

bash 复制代码
s1=""
if [ $s1]
then
    echo "$s1 != null"
else
    echo "$s1 == null"
fi

由于s1="",其值为空,所以执行结果为:

== null

第二个命令序列中的 if语句我们写成了 if [ $s1],仍能执行并获得正确的结果。

相关推荐
o(╥﹏╥)27 分钟前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
娶不到胡一菲的汪大东31 分钟前
Ubuntu概述
linux·运维·ubuntu
Yuan_o_43 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
那就举个栗子!1 小时前
Ubuntu 20.04下Kinect2驱动环境配置与测试【稳定无坑版】
linux·ubuntu
灯火不休➴1 小时前
[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
linux·运维·服务器
Lukea111 小时前
【新教程】Ubuntu server 24.04配置无线网WiFi
linux·ubuntu·教程
小峰编程1 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
卜及中1 小时前
【Linux】资源隔离机制 — 命名空间(Namespace)详解
linux·服务器·php
扛枪的书生1 小时前
Socat 命令总结
linux
涵信1 小时前
Windows11 安装 Ubuntu-20.04,同时安装配置 zsh shell,配置 git 别名(alias),大大提高开发效率
linux·git·ubuntu·bash