Bash中不区分大小写的比较

use*_*250 5 syntax bash

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

while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

Gil*_*not 7

shopt -s nocasematch
while [[ $yn == y || $yn == "yes" ]] ; do
Run Code Online (Sandbox Code Playgroud)

要么 :

shopt -s nocasematch
while [[ $yn =~ (y|yes) ]] ; do
Run Code Online (Sandbox Code Playgroud)

注意

  • [[是一个类似于(但比[命令更强大)的bash关键字.请参阅http://mywiki.wooledge.org/BashFAQ/031http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
    除非您正在为POSIX sh编写,否则我们建议您这样做[[.
  • 所述=~的操作者[[评估针对右手扩展正则表达式(ERE)的左手字符串.成功匹配后,BASH_REMATCH可用于从模式中扩展匹配的组.正则表达式的引用部分成为字面意思.为了安全和兼容,将正则表达式放在参数中并执行[[ $string =~ $regex ]]

  • 对于正则表达式,最好使用`^ .. $`例如`yn ="noyesno"` (2认同)

Rio*_*iot 6

无需使用 shopt 或正则表达式。执行此操作的最简单快捷的方法(只要您有 Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo "matched"
fi
Run Code Online (Sandbox Code Playgroud)

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