grep経由で確認できない

grep経由で確認できない
list="feature test release"
branch=feature/fix

ブランチ名がリストのプレフィックスで始まっていないことを確認してから、コマンドを終了しようとします。ブランチにリストのプレフィックスの1つがある場合は有効です。

 echo $list| grep -e "$branch/[a-zA-Z0-9]" ; echo $?

残念ながら、このコマンドは機能しません。どんなアイデアがありますか?つまりtest/bla、有効な分岐名ですがtesttest/blaそうではありません。

編集:を使用していますsh。有効なプレフィックスのリストは単一の文字列または配列であり、両方を使用できます。

ベストアンサー1

変数に有効なプレフィックスが必要ない場合は、次のいずれかの回避策を使用できます。

たとえば、feature/foo/bar有効かどうかに応じて、最後の1つだけを削除するか、/*すべて削除する必要があります。

branchaが含まれていることを確認するには、別々のテストが必要な場合があります/

check.sh:

#!/bin/sh

# foo/bar --> ^foo$
# foo --> ^foo$
# foo/bar/baz --> ^foo$
pattern='^'"${branch%%/*}"'$'

# search for pattern in input, suppress output
grep "$pattern" >/dev/null <<EOF
feature
test
release
EOF

echo $?

テスト

$ branch=featur/fix ./check.sh
0
$ branch=foo/fix ./check.sh
1
$ branch=xfeature/fix ./check.sh
1
$ branch=featurex/fix ./check.sh
1

編集する:

で述べたようにスティーブン・チャジェラスbranch='.*''指定されたブランチ名にforなどの正規表現メタ文字が含まれている場合、上記の回避策は予期しない一致を生成する可能性があります。

確認したい正確な値に応じて、文字列をなどの区切り文字で囲むことでこれを防ぐことができます/

# ...
pattern="/${branch%%/*}/"
# ...
fgrep "$pattern" >/dev/null <<EOF
/feature/
/test/
/release/
EOF
# ...

check2.sh:

#!/bin/sh

# removes longest match /*
# foo/bar/baz --> foo
case "${branch%%/*}" in
feature|test|release)
    echo valid 1
    ;;
*)
    echo invalid 1
    ;;
esac

# removes shortedt match /*
# foo/bar/baz --> foo/bar
case "${branch%/*}" in
feature|test|release)
    echo valid 2
    ;;
*)
    echo invalid 2
    ;;
esac

テスト

$ branch=feature/fix ./check2.sh
valid 1
valid 2
$ branch=feature/fix/bla ./check2.sh
valid 1
invalid 2
$ branch=xfeature/fix ./check2.sh
invalid 1
invalid 2
$ branch=featurex/fix ./check2.sh
invalid 1
invalid 2

おすすめ記事