我有以下一段 Bash 脚本:
function get_cms {
echo "input cms name"
read cms
cms=${cms,,}
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
get_cms
fi
}
但是无论我输入什么(正确和不正确的值),它都不会再次调用该函数,因为我只想允许这 3 个输入中的 1 个。
我已经用||
,[ var != value ] or [ var != value1 ] or [ var != value1 ]
试过了,但没有任何效果。
有人可以指出我正确的方向吗?
如果主要目的是检查是否在列表中找不到提供的值,也许您可以通过"相等波浪号"运算符使用 BASH 中内置的扩展正则表达式匹配(另请参阅此答案):
if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi
也许你最好对这样的列表使用case
:
case "$cms" in
wordpress|meganto|typo3)
do_your_else_case
;;
*)
do_your_then_case
;;
esac
我认为对于长这样的列表,这更易读。
如果您仍然喜欢if
可以通过两种方式使用单括号
if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then
或
if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then
而不是说:
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
说:
if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then
您可能还想参考条件构造。
正如@Renich所建议的,您还可以使用扩展通配进行模式匹配。因此,您可以使用与命令参数中的文件匹配相同的模式(例如 ls *.pdf
)在bash比较中。
对于您的特定情况,您可以执行以下操作。
if [[ "${cms}" != @(wordpress|magento|typo3) ]]
@
表示"匹配给定模式之一"。所以这基本上是说cms
不等于"wordpress"或"magento"或"typo3"。在正常的正则表达式语法中,@类似于^(wordpress|magento|typo3)$
。
Mitch Frazier 在 Linux Journal 上有两篇关于 Bash 中的模式匹配和 Bash 扩展通配的好文章。
有关扩展通配的更多背景信息,请参阅模式匹配(Bash 参考手册)。
的解决方案
if [[ "${cms}" != @(wordpress|magento|typo3) ]]; then