我有以下的bashscript:
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 ]
但没有任何作用。
有人能指出我正确的方向吗?
答案 0 :(得分:58)
如果主要目的是检查列表中是否找不到提供的值,也许您可以通过"等号和#34;使用BASH内置的扩展正则表达式匹配。运算符(另请参阅this answer):
if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi
度过愉快的一天
答案 1 :(得分:39)
也许你应该更好地使用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
答案 2 :(得分:33)
而不是说:
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
说:
if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then
您可能还想引用Conditional Constructs。
答案 3 :(得分:6)
正如@Renich所建议的(但不幸的是,有一个重要的错别字并未得到修复),您也可以使用扩展的globing进行模式匹配。因此,您可以使用与bash比较中的命令参数(例如ls *.pdf
)中的文件匹配相同的模式。
对于您的特殊情况,您可以执行以下操作。
if [[ "${cms}" != @(wordpress|magento|typo3) ]]
@
的意思是“匹配给定的模式之一”。因此,这基本上是说cms
与'wordpress'或'magento'或'typo3'不相等。在正常的正则表达式中,@类似于^(wordpress|magento|typo3)$
。
Mitch Frazier在Linux Journal上有关于Pattern Matching In Bash和Bash Extended Globbing的两篇好文章。
有关扩展的全局背景的更多信息,请参见Pattern Matching (Bash Reference Manual)。
答案 4 :(得分:2)
这是我的解决方案
if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then