1

我编写了以下 shell 脚本。

#! /bin/sh

foo=asdfqwer/asdfxv

if [ $foo = */* ]
then
    echo bad
else
    echo good
fi

在测试命令中,我们可以像这样比较字符串和模式,

[ string = pattern ]

[ string == pattern ]

但是,上面的脚本总是在终端打印“好”,并且也有如下错误:

[ : asdfqwer/asdfxv : unexpected operator

有人可以告诉我为什么以及如何比较 shell 脚本中的搅拌和模式吗?

4

2 回答 2

2

命令(test[命令)不进行全局比较。相反,shell 正在扩展*/*以匹配您目录中的文件,并将它们替换为该命令。据推测,其中一个文件名被解析为[命令的运算符,并且是无效的。

与 glob 进行比较的最佳方法是case

#!/bin/sh

foo=asdfqwer/asdfxv

case "$foo" in
   */*) echo bad ;;
   *) echo good ;;
esac
于 2012-11-09T23:52:37.053 回答
0
if [ "$foo" == "*/*" ]
then
    echo bad
else
    echo good

您需要双等号进行比较,看起来字符串比较需要双引号。

http://www.tech-recipes.com/rx/209/bournebash-shell-scripts-string-comparison/

于 2012-11-09T23:50:01.620 回答