Bash中不区分大小写的比较

时间:2013-03-21 21:06:06

标签: bash syntax

我正在尝试在不区分大小写的while语句中编写比较。基本上,我只是试图缩短以下内容,对用户提出是或否问题提示......

while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do

最好的方法是什么?

5 个答案:

答案 0 :(得分:7)

shopt -s nocasematch
while [[ $yn == y || $yn == "yes" ]] ; do

或:

shopt -s nocasematch
while [[ $yn =~ (y|yes) ]] ; do

注意

  • [[是一个类似于[命令(但功能更强大)的bash关键字。请参阅http://mywiki.wooledge.org/BashFAQ/031http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
    除非您是为POSIX sh撰写的,否则我们建议使用[[
  • =~ [[运算符根据右手扩展正则表达式(ERE)计算左手字符串。成功匹配后,BASH_REMATCH可用于从模式中扩展匹配的组。正则表达式的引用部分成为字面意思。为了安全起见兼容,将正则表达式放在参数中并执行[[ $string =~ $regex ]]

答案 1 :(得分:3)

无需使用shopt或regex。这是最简单快捷的方法(只要你有Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo "matched"
fi

您所做的就是将两个字符串转换为小写并比较结果。

答案 2 :(得分:2)

这是一个使用扩展模式而不是正则表达式的答案:

shopt -s nocasematch
shopt -s extglob
while [[ $yn = y?(es) ]]; do
  ...
done

请注意,从版本4.1开始,bash始终在[[ ... ]]条件表达式中使用扩展模式,因此不需要shopt行。

答案 3 :(得分:1)

尝试这个:

 [[ $yn =~ "^[yY](es)?$" ]] 

答案 4 :(得分:1)

我更喜欢简短地使用grep -Eegrep

while egrep -iq '^(y|yes)$' <<< $yn; do
  your_logic_here
done

这里有grep手册中的说明:

  

-i,--ignore-case

     

忽略PATTERN和输入文件中的大小写区别。 (-i由POSIX指定。)

     

-q,--quiet,--silent

     

安静;不要在标准输出中写任何东西。 如果发现任何匹配项,则立即以零状态退出,即使检测到错误也是如此。另请参见-s或--no-messages选项。 (-q由POSIX指定。)