【问题标题】:ksh validating string with logical ORksh 使用逻辑 OR 验证字符串
【发布时间】:2012-02-20 15:46:37
【问题描述】:

我正在用 ksh 编写一个脚本,它需要检查一个变量是否设置为两个可接受的值之一。我有以下代码,但是当我输入有效值时,例如"C" 我收到错误消息(不是有效值):

if  [[ "$Mode" != "C" ]] || [[ "$Mode" != "M" ]] 
then

   echo ""
   echo "*Not a valid value*"

   exit 2;

fi

我不知道为什么它在字符串比较上失败了,我已经尝试了语法上的变化,但仍然没有得到任何帮助,我们将不胜感激。

【问题讨论】:

    标签: shell ksh


    【解决方案1】:
    if ! [[  "$Mode" == "C" || "$Mode" == "M" ]] ; then
       echo ""
       echo "*Not a valid value*"
       exit 2;
    fi
    

    我认为这是测试多个值的更简单方法。我喜欢这样想'如果 Mode 不在 C、M 或 .... 的列表中;然后....'我看到初学者像你一样发布代码(当我还是初学者的时候我自己做了),因为你的心理模型是'如果模式不是 C 或模式不是 M 然后......',但是你真的需要'AND'代替(如jlliagre所示)。

    我希望这会有所帮助。

    【讨论】:

    • 太好了,这就是我要找的。​​span>
    • @amer :谢谢,我添加了一些 cmets。祝你好运。
    • 描述逻辑 OR 与 AND 的好方法
    【解决方案2】:

    几年后...

    对于那些可能会关注的人,原因 amer 的逻辑有缺陷的是,$Mode 总是要么不是“C”,要么不是“M”,因为即使是一个值比如“C”不是“M”,这使得第二个条件为真。

    这里有 2 个单线替代方案:

    [[ $Mode != "C" && $Mode != "M" ]] && echo -e "\n*Not a valid value*" && exit 2
    

    这种 bash 替代方法可以轻松简洁地添加更多有效值:

    [[ `echo $Mode | egrep "C|M"` ]] || echo -e "\n*Not a valid value*" && exit 2
    

    为什么每个人都写“$Mode”而不仅仅是$Mode?请在回答之前尝试一下。

    【讨论】:

    • 第 2 句中有很好的解释。但是您的第二种选择(也适用于 ksh)具有否定性,即您正在使用 3 个进程 echoegrep,以及为 cmd-substitution 创建的子shell执行外壳“免费”进行的比较;-)。可以使用case "$Mode" in C|M ) : correct_option_received ;; * ) echo "$Mode not a valid value for Mode, expected C or M" ;; esac 来替代使用您的(准)reg-ex 匹配理念。 : 是 shell 的空运算符,因此如果输入错误,此代码只会“抛出错误”。我将correct_opt_recd 包含为自文档 ....
    • 另外,我们在变量周围使用 dbl-quotes 作为防御性编程技术。如果Mode="A String WIth Spaces",您的第一个代码会发生什么?试试看 ;-) 。祝大家好运。
    • $ Mode="A String WIth Spaces"; [[ $Mode != C && $Mode != M ]] && echo Invalid || echo Valid Invalid ###############$ echo ${.sh.version} Version JM 93t+ 2010-05-24 ;-)
    • 好点关于“案例”,@shellter。但是,我已经在 ksh 和 bash 中尝试了我的代码,它可以在 $Mode 中使用空格。例如:Mode="A String WIth Spaces"; [[ $Mode != C && $Mode != M ]] && echo Invalid || echo Valid 输出为“无效”。运行这段代码会发生什么?
    • 感谢您在您的系统@shellter 上测试我的代码。当Mode="A String WIth Spaces" 时,看起来我们俩都得到了“无效”作为输出,这正是我们想要的。请解释在我的代码中,$Mode 周围的双引号是一种防御性编程技术。
    【解决方案3】:

    你的逻辑有缺陷。

    if  [[ "$Mode" != "C" ]] && [[ "$Mode" != "M" ]] 
    then
    
       echo ""
       echo "*Not a valid value*"
    
       exit 2;
    
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多