使用 sh shell 比较字符串

Posted

技术标签:

【中文标题】使用 sh shell 比较字符串【英文标题】:Compare a string using sh shell 【发布时间】:2012-06-06 15:17:03 【问题描述】:

我正在使用 SH shell,我正在尝试将字符串与变量的值进行比较,但 if 条件始终执行为真。为什么?

这是一些代码:

Sourcesystem="ABC"

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

即使这样也不行:

Sourcesystem="ABC"

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

其次,我们可以将其与 NULL 或空字符串匹配吗?

【问题讨论】:

首先在 Bourne shell 中你不需要额外的 ';'当我在 Bourne shell 中测试运行脚本时,if 条件为假。它首先会给出一个警告:[: ABC: integer expression expected。输出为:“源系统不匹配 ABC”。正如其他人所评论的, -eq 用于整数比较。在 Bourne shell (#!/bin/sh) 中使用单个等号进行字符串比较。你的 shell 应该首先纠正你。 投票重新开放。引用的 dups 用于 bash shell,而不是贫血的 sh shell,有时是 Posix shell 或 Dash。 同意并投票。 shbashCC++ 具有相同的关系。即使为第一个编写的代码在第二个中有效,但不能信任第二个的答案在第一个中起作用。 【参考方案1】:

我遇到了同样的问题,请这样做

if [ 'xyz' = 'abc' ]; then
  echo "match"
fi

注意空格。在这种情况下,请务必在 = 符号之前和之前使用空格。

查看“Other Comparison Operators”。

【讨论】:

在 Dockerfile: /bin/sh: 1: [: =: 意外操作符【参考方案2】:

eq 用于比较整数,使用等于 '=' 代替, 示例:

if [ 'AAA' = 'ABC' ];
then 
    echo "the same" 
else 
    echo "not the same"
fi

祝你好运

【讨论】:

注意:如果您要比较变量,请确保使用"$VAR" 而不仅仅是$VAR【参考方案3】:

您应该使用= 运算符进行字符串比较:

Sourcesystem="ABC"

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

man test 表示您使用-z 来匹配空字符串。

【讨论】:

不需要引用ABCXYZ 如果你的变量中可能有空格,那么引用是必要的。 调整了示例以使该部分更清晰@WilliamEverett。 如果两个字符串都包含多行,则此方法不适用于 sh 或 bash (macOS 11.2),其中第一行相等但后面的行不同 - 那么对于 @987654327,我总是正确的@ 测试。但是,使用 macOS 的新 zsh,我什至可以省略引号,如 [ $a = $b ],并获得多行字符串的正确结果。 @Thomas - OP 问题专门针对 sh 而不是 bash 或 zsh。 OP示例也永远不会是多行字符串。多行字符串可能应该采用不同的方法,而不是依赖 zsh 的功能,除非您在专门的 zsh 环境中工作。定位 sh 通常意味着您需要高可移植性,因为 bash 和/或 zsh 并非在您的所有环境中都可用。我在 macOS 上并且可以针对 zsh,但是当我的脚本被移动到我无法控制的 linux 系统时,由于 zsh 不存在,它们将失败。【参考方案4】:

-eq 是一个数学比较运算符。我从来没有将它用于字符串比较,依靠==!= 进行比较。

if [ 'XYZ' == 'ABC' ]; then   # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both
  echo "Match"
else
  echo "No Match"
fi

【讨论】:

请注意,== 运算符并非在每个 shell 上都有效。 = 是用于比较字符串的正确运算符,== 有时是同义词。 这个答案对于 /bin/sh 脚本来说是错误并且会失败。在 macOS 上,“test”命令(也可用作“[”)将“=”视为“=”。在 Linux 上则不然。【参考方案5】:

-eq 是用于比较整数的 shell 比较运算符。要比较字符串,您需要使用=

【讨论】:

【参考方案6】:

在我测试过的 4 个 shell 中,ABC -eq XYZtest 内置函数中为 zshksh 计算为真。在/usr/bin/testdashbash 的内置函数下,表达式的计算结果为假。在kshzsh 中,字符串被转换为数值并且相等,因为它们都是0。IMO,kshzsh 的内置函数的行为不正确,但是test 的规范对此模棱两可。

【讨论】:

感谢测试。这就是 Bourne shell 受欢迎的原因。 zsh 在使用 [ 或内置 test 后清楚地输出 : integer expression expected。也许您正在强制 [[ 将两者都评估为 0,因为字符串是 not 有效整数。 @code933k 哪个版本?如果行为发生了变化,我不会感到惊讶。 @WilliamPursell zsh 5.7.1【参考方案7】:

-eq 用于比较整数。请改用=

【讨论】:

并注意不要使用双等号"=="

以上是关于使用 sh shell 比较字符串的主要内容,如果未能解决你的问题,请参考以下文章

3.Shell字符串对比

Shell字符串比较相等不相等方法小结

shell中的算术比较

在bash shell 上如何按字母顺序比较两个字符串 ?

shell中字符串比较,整数大小比较

linux shell 比较字符串是不是相等