bash +减少比较线到短路

时间:2014-07-15 07:16:32

标签: regex linux bash

我希望将以下比较行缩减为短路

   [[ $ANSWER = YES ]] || [[ $ANSWER = yes ]] || [[ $ANSWER = Yes ]] && echo your answer is really yes

所以我尝试以下内容但没有成功

[[ $ANSWER = ([YES|Yes|yes]) ]] && echo your answer is really yes
[[ $ANSWER = [YES|Yes|yes]   ]] && echo your answer is really yes

请以正确的方式提出建议?

8 个答案:

答案 0 :(得分:2)

shopt允许您更改shell行为

shopt -s nocasematch
[[ $ANSWWER = "yes" ]]

shopt - bash reference

答案 1 :(得分:2)

您可以使用正则表达式:

if [[ $ANSWER =~ ^(YES|Yes|yes)$ ]] ; then echo 'your answer is really yes'; fi

答案 2 :(得分:2)

另一种方式,可能是最短的:

[[ $ANSWER =~ ^[Yy][Ee][Ss]$ ]] && echo your answer is really yes

或使用typeset(以避免 glogal shopt ):

typeset -l ANSWER
ANSWER=YES
[[ $ANSWER = yes ]] && echo your answer is really yes

仅禁用排版:

typeset +l ANSWER

来自bash man:

  

使用 + 代替 - 会关闭属性

答案 3 :(得分:1)

bash允许您进行正则表达式匹配。要匹配所有可能的情况组合,可以使用以下方法:

if [[ "$ANSWER" =~ ^[Yy][Ee][Ss]$ ]]; then echo "yes!"; fi

请注意,这也会匹配yEsyES,原始代码不会。如果您不想观看这些内容,请使用alfasin's answer

答案 4 :(得分:1)

哇,人们建议使用grep,shopt nocasematch,regexps ......虽然最简单的解决方案是:

[[ ${ANSWER^^} = 'YES' ]] && echo 'your answer is really yes'

那就是它。您可以阅读有关参数展开here

的信息

P.S。我想知道为什么没有人suggested to use extended globs:D

答案 5 :(得分:0)

使用grep执行此操作的另一种方法:

ANSWER="yEs";
if grep -qi "^yes$" <<< "$ANSWER"; then
    echo 'your answer is really yes'
fi

说明:

  1. 如果匹配,Grep会返回0,因此您可以将其用于if
  2. -q是安静的,所以没有输出
  3. -i不区分大小写。
  4. 请注意锚点^$,它们将与字符串完全匹配

答案 6 :(得分:0)

只需glob

[[ $ANSWER = [Yy][Ee][Ss] ]] && echo 'your answer is really yes'

扩展的glob:

shopt -s extglob
[[ $ANSWER = @(YES|Yes|yes) ]] && echo 'your answer is really yes'

答案 7 :(得分:0)

另一种正确的形式是

[[ $ANSWER =~ ^[Yy][Ee][Ss]$ ]]

它有效启动Bash 3.0。

注意:knittl已经修复了他的答案,所以不要小心。