使用 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。 同意并投票。sh
和 bash
与 C
和 C++
具有相同的关系。即使为第一个编写的代码在第二个中有效,但不能信任第二个的答案在第一个中起作用。
【参考方案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
来匹配空字符串。
【讨论】:
不需要引用ABC
或XYZ
。
如果你的变量中可能有空格,那么引用是必要的。
调整了示例以使该部分更清晰@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 XYZ
在 test
内置函数中为 zsh
和 ksh
计算为真。在/usr/bin/test
和dash
和bash
的内置函数下,表达式的计算结果为假。在ksh
和zsh
中,字符串被转换为数值并且相等,因为它们都是0。IMO,ksh
和zsh
的内置函数的行为不正确,但是test
的规范对此模棱两可。
【讨论】:
感谢测试。这就是 Bourne shell 受欢迎的原因。 zsh 在使用 [ 或内置 test 后清楚地输出 : integer expression expected。也许您正在强制 [[ 将两者都评估为 0,因为字符串是 not 有效整数。 @code933k 哪个版本?如果行为发生了变化,我不会感到惊讶。 @WilliamPursell zsh 5.7.1【参考方案7】:-eq
用于比较整数。请改用=
。
【讨论】:
并注意不要使用双等号"=="以上是关于使用 sh shell 比较字符串的主要内容,如果未能解决你的问题,请参考以下文章