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つだけを削除するか、/*
すべて削除する必要があります。
branch
aが含まれていることを確認するには、別々のテストが必要な場合があります/
。
例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