【问题标题】:Comparing strings for equality in ksh在 ksh 中比较字符串是否相等
【发布时间】:2023-04-10 13:23:01
【问题描述】:

我正在使用下面的 shell 脚本进行测试:

#!/bin/ksh -x


instance=`echo $1 | cut -d= -f2`
if [ $instance == "ALL" ]
then
echo "strings matched \n"
fi

它在 if 条件中给出了这个错误:

: ==: unknown test operator

== 真的不是正确的语法吗? 我在命令行上运行如下

test_lsn_2 INSTANCE=ALL

有人可以提出解决方案吗? 谢谢。

【问题讨论】:

  • if 中的 '$instance' 周围加上双引号,然后再试一次。让我知道这是否有效。
  • 不要在`$instance`周围加上双引号不起作用:(
  • 这是ksh 的哪个版本?

标签: bash unix shell ksh


【解决方案1】:

试试

if [ "$instance" = "ALL" ]; then

有几个错误:

  1. 您需要在变量两边加上双引号,以防止出现(不太可能)它为空的情况。在这种情况下,shell 会看到无效的 if [ = "ALL" ]; then

  2. shell 中的 Equals 使用单个 =(无法在 shell 中的 if 中分配值)。

【讨论】:

    【解决方案2】:

    我已经回答了一个类似的问题。基本上你需要的运算符是=(不是==),如果你的变量为空(即它变成if [ = ALL]),语法就会中断。详情请查看the other answer

    【讨论】:

      【解决方案3】:

      要比较字符串,您需要单个 =,而不是双精度。如果字符串为空,则应将其放在双引号中:

      if [ "$instance" = "ALL" ]
      then
          echo "strings matched \n"
      fi
      

      【讨论】:

        【解决方案4】:

        我看到您使用的是 ksh,但您添加了 bash 作为标签,您接受与 bash 相关的答案吗? 使用 bash 您可以通过以下方式完成:

        if [[ "$instance" == "ALL" ]]
        if [ "$instance" = "ALL" ]
        if [[ "$instance" -eq "ALL" ]]
        

        有关更多信息,请参阅here

        【讨论】:

        • 感谢您的回复。正如安德烈米勒所说==不工作=正在工作。我会接受你的回答,但也会为安德烈+1
        • 我认为第三个选项不是一个好主意。 AFAIK,-eq 用于整数比较,而不是字符串。
        【解决方案5】:
        totest=$1
        case "$totest" in
          "ALL" ) echo "ok" ;;
          * ) echo "not ok" ;;
        esac
        

        【讨论】:

          猜你喜欢
          • 2010-12-20
          • 1970-01-01
          • 2016-08-10
          • 1970-01-01
          • 1970-01-01
          • 2013-02-10
          • 2011-04-25
          相关资源
          最近更新 更多