【问题标题】:Why is my shell script giving the same output for every case?为什么我的 shell 脚本对每种情况都给出相同的输出?
【发布时间】:2015-05-05 12:24:06
【问题描述】:

问题是编写一个脚本来检查读取的字符是“Y”、“y”、“n”还是“N”,并相应地显示结果。

但是,对于我给出的每个输入,我都会得到输出 YES。我完全是脚本新手,不知道是什么原因造成的。

代码如下:

#!/bin/bash
read CHAR

if [ [$CHAR=="Y"] -o [$CHAR=="y"] ]; then
        echo "YES"
elif [ [$CHAR=="N"] -o [$CHAR=="n"] ]; then
        echo "NO"
fi

【问题讨论】:

  • 避免使用ALL_CAPS 变量。按照惯例,它们是为 shell/etc 保留的。使用。

标签: string bash shell compare


【解决方案1】:

括号不像test 表达式中的括号那样起作用。此外,test 使用 =,而不是 ==。而且您还需要将表达式正确拆分为标记(通过在= 符号周围添加空格)。所以你想要的是这样的:

if [ "$CHAR" = Y -o "$CHAR" = y ]; then
    echo "YES"
elif [ "$CHAR" = N -o "$CHAR" = n ]; then
    echo "NO"
fi

请注意,我还引用了"$CHAR"。这使得程序在$CHAR 为空或包含空格的情况下更加健壮。另一方面,YN 不需要任何引号,因为它们是常量且不包含空格。

更准确地说,当每个$CHAR 表达式扩展为一个类似于[N==Y] 的标记时,程序中会发生什么,这对于test 来说是一个没有特殊意义的标记。任何缺乏特殊意义的标记都会被test 解释为“真”。

【讨论】:

    【解决方案2】:

    您需要使用单个= 进行字符串比较,并且括号太多。于是代码变成了:

    #!/bin/bash
    read CHAR
    
    if [ "$CHAR" = "Y" -o "$CHAR" = "y" ]; then
      echo "YES"
    elif [ "$CHAR" = "N" -o "$CHAR"="n" ]; then
      echo "NO"
    fi
    

    下次当您想调试脚本为什么它不起作用时,运行如下:bash -x ./script.sh 或在bash 之后的第一行添加-x


    检查以下单行:

    read CHAR && [ "${CHAR^^}" = "Y" ] && echo YES || echo NO
    

    它正在使用bash parameter expansion,请参阅:Case Insensitive comparision of strings in Shell script

    【讨论】:

    • 谢谢!!有效。但是你能解释一下脚本中正确间距的重要性吗?我还没弄明白。
    • @ZeWisdom 它更简洁,更易于阅读,更符合通用编码标准,因此这是一个很好的做法。其次,当您不在表达式之间放置空格时,有时 bash 会失败,例如在括号旁边([])。
    • 那是因为[ 不是shell 语法。它是一个命令(例如参见ls /usr/bin[),因此它必须是它自己的词才能正常工作。你不会指望echo"$CHAR" 工作吧?
    【解决方案3】:
    #!/bin/bash
    read "CHAR"
    
    if [[ "$CHAR" == "Y" || "$CHAR" == "y" ]]; then
            echo "YES"
    elif [[ "$CHAR" == "N" || "$CHAR" == "n" ]]; then
            echo "NO"
    fi
    

    试试这个! 问题似乎是“-o”与双“=”的使用,以及 if 和 elif 中的空格作为括号。

    【讨论】:

      【解决方案4】:

      case 语句可读性很强

      read char
      case ${char,} in
        y*) echo Yes;;
        n*) echo No;;
      esac
      

      https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

      【讨论】:

      • bash 4+ 仅用于小写扩展。
      猜你喜欢
      • 2015-11-27
      • 2020-08-02
      • 2019-01-02
      • 2017-09-22
      • 2019-12-17
      • 2021-02-12
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多