文字列がどのようなもので始まるのか、それとも何を含むのかを調べる関数を書いてください。

文字列がどのようなもので始まるのか、それとも何を含むのかを調べる関数を書いてください。

var与えられた変数(例えば)が与えられた文字列のリスト内の単語で始まるかどうかを確認する関数を書きたいです。このリストは変更されません。

インスタンス化するために、またはvarで始まるかどうかを確認したいとしますaaabc3@3

varまた、文字が含まれていることを確認したいと思います>

この関数が呼び出されると仮定すると、check_func私の意図された用途は次のとおりです。

if check_func "$var"; then
    do stuff
fi

aardvarkたとえば、とのために「何かを行う」必要がありますabcdef[email protected]12>5


私は見たこの問題ユーザーが作品の一部を提供する状況:

beginswith() { case $2 in "$1"*) true;; *) false;; esac; }

上記のリストを繰り返し、この機能を使用するという考えです。私の難しさは、シャットダウン(または復帰に代わるもの)がこれをどのように行うべきかを正確に理解していないことです。

ベストアンサー1

check_prefixes () {
    value=$1

    for prefix in aa abc 3@3; do
        case $value in
            "$prefix"*) return 0
        esac
    done

    return 1
}

check_contains_gt () {
    value=$1

    case $value in
        *">"*) return 0
    esac

    return 1
}

var='aa>'
if check_prefixes "$var" && check_contains_gt "$var"; then
    printf '"%s" contains ">" and starts with one of the prefixes\n' "$var"
fi

テストを2つの機能に分けました。case ... esacこれが決定されると、両方が使用され、成功(0)を返します。一致するものがない場合は、 failure(1) が返されます。

プレフィックスリストを動的リストのようにするには、最初の関数を次のように書くことができます。

check_prefixes () {
    value=$1
    shift

    for prefix do
        case $value in
            "$prefix"*) return 0
        esac
    done

    return 1
}

(確認する値は最初のパラメータです。これを関数のパラメータリストに保存し、関数のパラメータリストから削除します。残りのパラメータを繰り返します。)次に、valueshiftのように呼び出します。

check_prefixes "$var" aa abc 3@3

2番目の機能も同様の方法で変更できます。

check_contains () {
    value=$1
    shift

    case $value in
        *"$1"*) return 0
    esac

    return 1
}

(任意の部分文字列を確認してください)または

check_contains_oneof () {
    value=$1
    shift

    for substring do
        case $value in
            *"$substring"*) return 0
        esac
    done

    return 1
}

(複数のサブストリングのいずれかを確認してください)

おすすめ記事