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"