为什么我的shell脚本为每个案例提供相同的输出?

时间:2015-03-04 13:30:30

标签: string bash shell compare

问题是编写一个脚本来检查读取的字符是“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

4 个答案:

答案 0 :(得分:3)

括号在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]的令牌,这是一个对{{1}没有特殊意义的令牌}}。任何缺乏特殊意义的令牌都被test解释为" true"。

答案 1 :(得分:1)

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

#!/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后的第一行中运行:-x或添加bash }。


检查以下单行:

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

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

答案 2 :(得分:1)

案例陈述可以非常易读

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

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

答案 3 :(得分:0)

#!/bin/bash
read "CHAR"

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

试试吧! 问题似乎是" -o" with double" =",以及if括号和elif中的空格。