我正在尝试在不区分大小写的while语句中编写比较。基本上,我只是试图缩短以下内容,对用户提出是或否问题提示......
while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do
最好的方法是什么?
答案 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/031和http://mywiki.wooledge.org/BashGuide/TestsAndConditionals [[
。=~
[[
运算符根据右手扩展正则表达式(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 -E
或egrep
:
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指定。)