1

この例では、$@ に "load" と "/" という 2 つの単語/記号が含まれているかどうかを知りたい

1つの単語/記号の場合、これは機能します

    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

しかし、2 つの単語/記号がランダムな場所に表示される場合、その方法がわかりません。

アップデート:

入力はモジュールコマンドになります。この場合、バージョンを示す / の有無にかかわらずモジュールのロードかどうかを知りたいです。コマンドは次のようになります

1) module load appname/1.1.1 または
2) module load appname
3) module (ロードされていない) (list、avail など)

今のところ気になるナンバー1です。
3 は場合によっては 1 のバリエーションになります
。2 はそのまま実行されますが、ユーザーへのメッセージが含まれます。

4

3 に答える 3

2

遅い方法は、次のように、配列を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つのパラメーターを正確に「ロード」し、別のパラメーターにスラッシュを含める必要があります。)

于 2012-10-24T13:21:23.650 に答える
0

このようなことが可能です:

if [[ ${@} =~ .*/.* && ${@} =~ ((^)|([ ]))load(($)|([ ])) ]]
それから
  両方をエコー
フィ

-また-

LOAD=0 の場合 && SLASH=0 && \
   ${@} の ARG の場合。
   行う
     if [ "${ARG#*/}" != "${ARG}" ]; 次にSLASH=1; フィ
     if [ "${ARG}" = "ロード" ]; 次に、LOAD=1; フィ
   完了 && [ "${LOAD}${SLASH}" = "11" ];
それから
  両方をエコー
フィ

-また-

関数 loadlash()
{
  ロード=0 && スラッシュ=0
  ${@} の ARG の場合。
  行う
    if [ "${ARG#*/}" != "${ARG}" ]; 次にSLASH=1; フィ
    if [ "${ARG}" = "ロード" ]; 次に、LOAD=1; フィ
  終わり
  test "${LOAD}${SLASH}" = "11"
}

ロードスラッシュ ${@} の場合
それから
  両方をエコー
フィ
于 2012-10-24T13:47:17.327 に答える
0

これはあなたの要件を満たすでしょう

if [[ $1 == "load" ]]; then
    if [[ $2 == */* ]]; then
        do first case
    else
        do second case
    fi
else
    do third case
fi
于 2012-10-24T13:53:10.960 に答える