• 本页内容

29. 字符串比较


要比较字符串,请使用以下运算符。

运算符 描述
= 相等
== 相等
!= 不等
< 小于
> 大于
-z 零字节?给定的字符串是否为空?
-n 不是空的? 给定的字符串不为空吗?

以下示例演示如何在if语句中使用字符串比较运算符。

$ cat operators-string.sh
state=${1}
if [ "$state" == "california" ]; then
    echo "==: state is california"
fi
if [ "$state" != "california" ]; then
    echo "==: state is not california"
fi
if [ "$state" \< "indiana" ]; then
    echo "<: state comes before indiana"
fi
if [ "$state" \> "indiana" ]; then
    echo ">: state comes after indiana"
fi
if [ -n "$state" ]; then
    echo "-n: state is not null"
fi
if [ -z "$city" ]; then
    echo "-z: city is null"
fi

通过传递参数来执行上面的 shell 脚本,看看各种测试条件是如何工作的:

$ ./operators-string.sh california
==: state is california
<: state comes before indiana
-n: state is not null
-z: city is null

注意:在上面的示例中,单个等号 (=) 与双等号 (==) 相同。 两者都在if […]测试结构内进行字符串比较。 但是,为了避免任何混淆,我建议您始终使用==进行比较,使用=进行赋值。

关于字符串比较和示例的附加说明

  • 需要在待测试变量前添加-n-z。 否则 bash 将没有任何东西可以测试。
  • -z代表零字节。 在使用 -z 时,我们实际上是在检查给定变量是否为零字节或不为空。
  • 变量 city 以前从未在任何地方定义过。 因此,当您使用-z检查它是否为 null 时,测试将返回 true
  • 当使用<>时,bash 会进行 ASCII 比较。 例如,"apple"<"ball"为真, 因为 "a" 位于 "b" 之前。
  • if测试结构中使用<>时,应使用反斜杠(\)对其进行转义。

您可以使用-z&&的组合来启动未运行的进程。 以下示例仅在 apache 尚未运行时启动它。

[ -z "`/bin/ps ax | /bin/grep httpd | /bin/grep -v /bin/grep`" ] && \
/usr/local/bin/apache2/apachectl start

当你引用一个变量时,你应该总是用双引号来避免任何错误。 在以下示例中,[ -z $city]中的$city未加双引号。 当 city 中不包含任何空格时,这不会给出任何错误,如下所示。

$ city="Vegas"
$ [ -z $city ] && echo "City is null"

但是,当变量 city 的值中有空格时,这将失败并抛出错误消息,如下所示。

$ city="Las Vegas"
$ [ -z $city ] && echo "City is null"
-bash: [: Las: binary operator expected

如果增加双引号$city,bash 将不会抛出任何错误消息。

$ city="Las Vegas"
$ [ -z "$city" ] && echo "City is null"