【问题标题】:Comparing Variables Not Working as expected in Bash比较在 Bash 中未按预期工作的变量
【发布时间】:2022-10-24 05:18:30
【问题描述】:
read X
read Y
read Z

if [ $X = $Y = $Z ]
    then
        echo EQUILATERAL # ALL X, Y, Z ARE EQUAL
        
elif [[ $X = $Y || $X = $Z || $Y = $Z ]]
    then
        echo ISOSCELES # ONLY 2 VARIABLES ARE EQUAL
    
else
    echo SCALENE # NONE IS EQUAL
fi

好吧,我这里有两个问题,首先是 $X = $Y = $Z 的用法是否有效。其次,当我输入 3 个类似变量时,它会打印 ISOSCELES 而不是 EQUILATERAL。是逻辑错误,还是第一部分在语法上不正确?

【问题讨论】:

  • Bash 没有像 [ $X = $Y = $Z ] 这样的东西 你需要 [ "$X" = "$Y" ] && [ "$Y" = "$Z" ] 总是将你的代码发布到 ShellCheck 以首先解决这样的小问题,然后如果你仍然有问题,请在此处发布。
  • 不要在一篇文章中问两个问题。使用单独的帖子,特别是因为您的第二个问题没有意义,除非第一个问题已解决:您的程序不会打印您在问题中描述的内容,而只是抛出一条错误消息bash:[:参数太多因为错误的if 声明。
  • 你错过了一些可能性:什么类型是 (x=1,y=1,z=2) 或 (x=1,y=1,z=3)?
  • @DavidC.Rankin 您可能可以在这里将您的评论变成答案?因为这本质上是 OP 所要求的
  • @TheDreamsWind - 你为什么不继续写下来。来自 cmets 的一个很好的集合,包括关于 ShellCheck 的提示将为这个问题提供一个很好的答案。我只是从“您的代码中有以下语法错误。(项目符号 A、B、C)”开始,然后解释 bash 的要求(包括在 [ ... ] 或 @987654328 中使用双引号的要求@(同义词)。如果您需要参考,我喜欢 man7.org 页面,例如 man 1 bash

标签: linux bash shell


【解决方案1】:

根据 Bash 语法和我的理解。我们不能同时将多个变量与一个变量进行比较。因此,我们将为每个比较打开多个条件检查 []: 我改了[ $X = $Y = $Z ] To [ "$X" = "$Y" ] && [ "$Y" = "$Z" ]

#!/bin/bash

read -r X
read -r Y
read -r Z

if [ "$X" = "$Y" ] && [ "$Y" = "$Z" ]
    then
        echo EQUILATERAL # ALL X, Y, Z ARE EQUAL
        
elif [[ $X = "$Y" || $X = "$Z" || $Y = "$Z" ]]
    then
        echo ISOSCELES # ONLY 2 VARIABLES ARE EQUAL
    
else
    echo SCALENE # NONE IS EQUAL
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多