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],仍能执行并获得正确的结果。

相关推荐
maosheng11466 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken7 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2917 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C7 小时前
CPU Cache
linux·cache
551只玄猫7 小时前
新编大学德语1第三版笔记 第5课Essen und Trinken
笔记·学习笔记·德语·外语·德语a1·自学德语·新编大学德语
Hoshino.418 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源10 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry10 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu10 小时前
Linux安装redis
linux·运维·redis
寂柒12 小时前
序列化与反序列化
linux·网络