如何在Bash中比较字符串?

评论 0 浏览 0 2019-05-04

在编写Bash脚本时,你经常需要比较两个字符串,检查它们是否相等。当两个字符串具有相同的长度并且包含相同的字符序列时,它们是相等的。

本教程描述了如何在Bash中比较字符串。

比较运算符

比较运算符是比较数值并返回真或假的运算符。在Bash中比较字符串时,你可以使用以下运算符:

  • string1 = string2 and string1 == string2 - 如果操作数相等,则相等运算符返回 true
    • 使用=运算符和test [命令结合使用。
    • 使用==运算符和[[命令来进行模式匹配。
  • string1 != string2 - 如果操作数不相等,不等式运算符会返回true。
  • string1 =~ regex- 如果左边的操作数与右边的扩展正则表达式相匹配,则regex操作数返回true。
  • string1 > string2 - 如果左边的操作数大于右边的操作数,则大于运算符的返回值为true,该运算符是按词法(字母顺序)排序的。
  • string1 < string2 - 如果右边的操作数大于按lexicographical(字母顺序)排序的右边的操作数,小于操作数返回true。
  • -z string - 如果字符串的长度为零,则为true。
  • -n string - 如果字符串的长度不为零,则为true。

以下是在比较字符串时需要注意的几点:

  • 在二进制运算符和操作数之间必须使用一个空格。
  • 始终在变量名称周围使用双引号,以避免任何分词或通配符问题。
  • Bash并不按 "类型 "来区分变量,变量根据上下文被视为整数或字符串。

检查两个字符串是否相等

在大多数情况下,当比较字符串时,你会想检查这些字符串是否相等。

下面的脚本使用if 语句和test [命令来检查字符串是否与=运算符相等:

#!/bin/bash

VAR1="Linuxize"
VAR2="Linuxize"

if [ "$VAR1" = "$VAR2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

当脚本被执行时,它将打印出以下输出结果。

输出

Strings are equal.

这里是另一个脚本,它接受用户的输入,并对给定的字符串进行比较。在这个例子中,我们将使用[[命令和==运算符。

#!/bin/bash

read -p "Enter first string: " VAR1
read -p "Enter second string: " VAR2

if [[ "$VAR1" == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

运行该脚本,并在提示时输入字符串:

输出

Enter first string: Linuxize
Enter second string: Ubuntu
Strings are not equal.

你也可以使用逻辑和&&和或||来比较字符串:

[[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal"

输出

Not equal

检查一个字符串是否包含一个子串

有多种方法来检查一个字符串是否包含一个子串。

一种方法是用星号符号*包围子串,这意味着匹配所有的字符。

#!/bin/bash

VAR='GNU/Linux is an operating system'
if [[ $VAR == *"Linux"* ]]; then
  echo "It's there."
fi

该脚本将echo以下内容:

输出

It's there.

另一个选择是使用重合运算符=~,如下图所示:

#!/bin/bash

VAR='GNU/Linux is an operating system'
if [[ $VAR =~ .*Linux.* ]]; then
  echo "It's there."
fi

句点后跟星号.*,匹配零个或多个出现的任何字符(换行符除外)。

检查一个字符串是否是空的

很多时候,你也需要检查一个变量是否是空字符串。你可以通过使用-n-z运算符来做到这一点。

#!/bin/bash

VAR=''
if [[ -z $VAR ]]; then
  echo "String is empty."
fi

输出

String is empty.
#!/bin/bash

VAR='Linuxize'
if [[ -n $VAR ]]; then
  echo "String is not empty."
fi

输出

String is not empty.

使用 Case 运算符比较字符串

你也可以使用case 语句来比较字符串,而不是使用测试运算符:

#!/bin/bash

VAR="Arch Linux"

case $VAR in

  "Arch Linux")
    echo -n "Linuxize matched"
    ;;

  Fedora | CentOS)
    echo -n "Red Hat"
    ;;
esac

输出

Linuxize matched.

字典式的比较

字典式的比较是一种操作,通过从左到右依次比较字符串中的字符,将两个字符串按字母顺序进行比较。这种比较很少使用。

以下脚本按字典顺序比较两个字符串:

#!/bin/bash

VAR1="Linuxize"
VAR2="Ubuntu"

if [[ "$VAR1" > "$VAR2" ]]; then
    echo "${VAR1} is lexicographically greater then ${VAR2}."
elif [[ "$VAR1" < "$VAR2" ]]; then
    echo "${VAR2} is lexicographically greater than ${VAR1}."
else
    echo "Strings are equal"
fi

该脚本将输出以下内容:

输出

Ubuntu is lexicographically greater than Linuxize.

总结

比较字符串是Bash脚本中最基本和最经常使用的操作之一。读完本教程后,你应该对如何在Bash中比较字符串有了很好的理解。你还可以查看我们关于字符串连接的指南。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-07-02
0 个评论
标签