我想知道是否有可能在一个 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 个竖线 (||
)?
不执行您想要的操作的代码不是解释您真正想要的内容的好方法。也许你正在寻找
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 没有这样的限制。
在 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 语句来匹配不同的模式。
确保选择的分隔符不会干扰您的实际值(在上面的情况下,我使用了简单的串联)。根据您的具体用例和变量的性质调整方法。