9

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

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

解决此问题的最佳方法是什么?

4

5 回答 5

11
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 ]]
于 2013-03-21T21:09:27.510 回答
8

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

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

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

于 2015-08-25T17:45:17.893 回答
3

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

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

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

于 2013-03-21T21:33:15.767 回答
1

也试试这个:

 [[ $yn =~ "^[yY](es)?$" ]] 
于 2013-03-21T21:12:45.480 回答
1

我更喜欢使用grep -Eoregrep简称:

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

这里有grep手册的解释:

-i,--忽略大小写

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

-q,--安静,--静音

安静的; 不要向标准输出写入任何内容。 如果找到任何匹配项,即使检测到错误,也会立即以零状态退出。另请参阅 -s 或 --no-messages 选项。(-q 由 POSIX 指定。)

于 2018-07-30T13:21:35.007 回答