如何在bash脚本中进行字符比较?

pos*_*ing 4 bash shell

这是我的代码

#! /bin/bash
read var
if [ $var="Y" -o $var="y" ]
then
    echo "YES"
else
    echo "NO"
fi
Run Code Online (Sandbox Code Playgroud)

如果用户按y或Y我想打印YES,否则我想打印NO.为什么这段代码不起作用?

mak*_*dev 6

基本上,你的条件是错误的.引用你的变量并在运算符之间留空格(如shellter写的).所以看起来应该是这样的:

#! /bin/bash
read var
if  [ "$var" = "Y" ] || [ "$var" = "y" ]
then
    echo "YES"
else
    echo "NO"
fi
Run Code Online (Sandbox Code Playgroud)

编辑:用于POSIX兼容性

  • 替换===- 见评论
  • -o||语法替换语法- 请参阅注释

  • 而且,`==`在这里是一种基础. (3认同)
  • 引用变量的比较或多或少是最佳实践它与变量未设置的可能性有关,这会导致语法错误.是的,在你的情况下你可能不需要它.但你应该.:) (2认同)
  • @lufork如果未加引号的变量为空,或者包含空格或某些通配符,则会导致问题.尝试不带引号的`var` blank,或设置为"yes my guess"或"*".将变量引用放在双引号中几乎总是一个好主意,只是为了避免在变量包含任何意外情况时出现奇怪的结果. (2认同)

SLe*_*ort 5

使用 Bash,您还可以在测试中使用正则表达式和运算=~符:

read var
[[ "$var" =~ [Yy] ]] && echo "YES" || echo "NO"
Run Code Online (Sandbox Code Playgroud)

或者正如 Benjamin W. 提到的,只需将字符范围与==运算符一起使用:

read var
[[ "$var" == [Yy] ]] && echo "YES" || echo "NO"
Run Code Online (Sandbox Code Playgroud)