如何检查“case”中是否有多个变量?

问题描述 投票:0回答:2

我想知道是否有可能在一个 case 语句中使用多个变量,这样我就不必两次维护相同的 case ?

case "${LC_ALL}" || "${LANG}" in    # something like this would come in handy
  "es"*)
    # numerous lines
  ;;
  "VALUE1" | "VALUE2")              # i know 2 different VALUES are possible, but not helpful in my situation
    # numerous lines
  ;;
esac

当然我已经阅读了https://www.gnu.org/software/bash/manual/bash.html#index-case并在网上搜索了一些类似的示例,但不幸的是在这方面没有发现任何内容。
是的,我还发现了CASE语句中的多个变量,但不知何故,它似乎是一种完全不同的方法(我没有完全理解)。

额外问题:为什么在 2 个值之间只使用 1 个竖线 (

|
),而不是像命令等中的逻辑“或”那样使用 2 个竖线 (
||
)?

bash shell sh
2个回答
1
投票

不执行您想要的操作的代码不是解释您真正想要的内容的好方法。也许你正在寻找

case ${LC_ALL}${LANG} in
  *"es"* )
    # numerous lines
  ;;
  *"VALUE[12]"*)
    # numerous lines
  ;;
esac

如果您想确保检查整个值,也许可以尝试

case :${LC_ALL}:${LANG}: in
  *:"es":* )
    # numerous lines
  ;;
  *:"VALUE[12]":*)
    # numerous lines
  ;;
esac

(当然,如果该值可以包含冒号,则可能会选择不同的分隔符。在接近重复的情况下,他们为此使用了加号)。

我认为语法没有充分的理由优先选择

|
而不是
||
,但也没有充分的理由做相反的事情。替代方案是全局模式,而不是命令。
x | y
已经意味着其他东西,所以他们必须在 OR 命令之间使用
||
,但对于 glob 没有这样的限制。


0
投票

在 Bash 中,case 语句并不直接支持您尝试使用多个变量的方式。但是,您可以通过将

${LC_ALL}
${LANG}
的值连接到单个变量中,然后使用单个 case 语句来实现类似的功能。

这是一个例子:

combined_var="${LC_ALL}${LANG}"

case "$combined_var" in
  "es"*)
    # n num of lines
  ;;
  "VALUE1" | "VALUE2")
    # n num of lines
  ;;
esac

这样,您可以通过连接

${LC_ALL}
${LANG}
的值来有效地创建一个复合变量组合变量,然后您可以使用单个 case 语句来匹配不同的模式。

确保选择的分隔符不会干扰您的实际值(在上面的情况下,我使用了简单的串联)。根据您的具体用例和变量的性质调整方法。

© www.soinside.com 2019 - 2024. All rights reserved.