case或If string包含word1和word2

时间:2012-10-24 12:13:58

标签: bash if-statement case

在这个例子中,我希望它知道$ @是否包含两个单词/符号“load”和“/”

对于一个单词/符号,这是有效的

    case "$@" in */*)
    ;;
    echo "going to do stuff"
*)
    echo "will do something else"
    ;;
esac

string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

但如果两个单词/符号出现在随机位置,我就无法弄清楚如何去做。

更新

输入将是module命令。在这种情况下,我想知道是否是带有或不带/表示版本的模块加载。命令看起来像这样

1)模块加载appname / 1.1.1或
2)模块加载appname
3)模块(不加载)(列表,可用等)

现在我感兴趣的是1号。
在某些情况下,3将是1的变化 2将按原样运行,但将包含一条消息给用户

3 个答案:

答案 0 :(得分:2)

缓慢的方法是迭代数组两次,然后检查是否存在“load”和“/”,如下所示:

for element in $@; do [[ "$element" == "load" ]] && loadPresent=1; done
for element in $@; do [[ "$element" =~ ".*/.*" ]] && slashPresent=1; done
if [[ $loadPresent == 1 ]] && [[ $slashPresent == 1 ]]; then
   echo "Contains load and /"
fi

(正如我解释你的问题,你希望一个参数完全是“加载”而另一个参数包含一个斜杠。)

答案 1 :(得分:0)

这样的事情是可能的:

if  [[ ${@} =~ .*/.* && ${@} =~ ((^)|([ ]))load(($)|([ ])) ]]
then
  echo both
fi

-OR -

if LOAD=0 && SLASH=0 && \
   for ARG in ${@};
   do
     if [ "${ARG#*/}" != "${ARG}" ]; then SLASH=1; fi
     if [ "${ARG}" = "load" ]; then LOAD=1; fi
   done && [ "${LOAD}${SLASH}" = "11" ];
then
  echo both
fi

-OR -

function loadslash()
{
  LOAD=0 && SLASH=0
  for ARG in ${@};
  do
    if [ "${ARG#*/}" != "${ARG}" ]; then SLASH=1; fi
    if [ "${ARG}" = "load" ]; then LOAD=1; fi
  done
  test "${LOAD}${SLASH}" = "11"
}

if loadslash ${@}
then
  echo both
fi

答案 2 :(得分:0)

这将满足您的要求

if [[ $1 == "load" ]]; then
    if [[ $2 == */* ]]; then
        do first case
    else
        do second case
    fi
else
    do third case
fi