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"