问题是编写一个脚本来检查读取的字符是“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
答案 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
为空或包含空格的情况下更加健壮。另一方面,Y
和N
不需要任何引用,因为它们是常量并且不包含空格。
更准确地说,程序中会发生什么,因为每个$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中的空格。