我正在尝试在不区分大小写的 while 语句中编写比较。基本上,我只是试图缩短以下内容,以便对用户提出是或否问题提示...
while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do
解决此问题的最佳方法是什么?
shopt -s nocasematch
while [[ $yn == y || $yn == "yes" ]] ; do
或者 :
shopt -s nocasematch
while [[ $yn =~ (y|yes) ]] ; do
[[
是一个与命令类似(但比[
命令更强大)的 bash 关键字。请参阅http://mywiki.wooledge.org/BashFAQ/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals[[
.=~
运算符根据右手[[
扩展正则表达式 (ERE) 计算左手字符串。成功匹配后,BASH_REMATCH
可用于从模式中扩展匹配组。正则表达式的引用部分变为文字。为了安全和兼容,将正则表达式放入参数中并执行[[ $string =~ $regex ]]
无需使用 shopt 或正则表达式。最简单快捷的方法(只要你有 Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo "matched"
fi
您所做的只是将两个字符串都转换为小写并比较结果。
这是一个使用扩展模式而不是正则表达式的答案:
shopt -s nocasematch
shopt -s extglob
while [[ $yn = y?(es) ]]; do
...
done
请注意,从版本 4.1 开始,始终在条件表达式中bash
使用扩展模式,因此不需要该行。[[ ... ]]
shopt
也试试这个:
[[ $yn =~ "^[yY](es)?$" ]]
我更喜欢使用grep -E
oregrep
简称:
while egrep -iq '^(y|yes)$' <<< $yn; do
your_logic_here
done
这里有grep
手册的解释:
-i,--忽略大小写
忽略 PATTERN 和输入文件中的大小写区别。(-i 由 POSIX 指定。)
-q,--安静,--静音
安静的; 不要向标准输出写入任何内容。 如果找到任何匹配项,即使检测到错误,也会立即以零状态退出。另请参阅 -s 或 --no-messages 选项。(-q 由 POSIX 指定。)