2

文字列変数の値がユーザー提供または生成されたものかどうかを簡単にチェックする方法を実装したいと思います。

これまでの「アルゴリズム」は、文字列が生成された場合に「GUARD」値を文字列に追加/先頭に追加するだけです。何かのようなもの:

 USERVAL=$1
 GUARDEDVAL=GUARD_${USERVAL}_GUARD

今、変数の値にこれらのGUARDSが設定されているかどうかを確認する簡単なチェックを探しています。例:

 check_guard() {
   local v=$1
   if [ "${v}" = "${v#GUARD_}" ]; then return 1; fi ## missing leading 'GUARD_'
   if [ "${v}" = "${v%_GUARD}" ]; then return 1; fi ## missing trailing 'GUARD_'
   return 0
 }
 check_guard "${GUARDEDVAL}" && echo "ok"
 check_guard "${USERVAL}"    && echo "ok"

の実装はcheck_guard正常に機能するようになりましたが、少し冗長だと思います。

私の質問は:値の両端に文字列が存在するかどうかをチェックできますか?

このようなもの(明らかに機能していません):

test "${v}" != "${${v#GUARD_}%_GUARD}"

私はむしろbashビルトインのみを使用し、sedのような外部コマンドは使用しません。

test "${v}" = "GUARD$(echo $v | sed -e 's|GUARD||g')GUARD"

これらすべてのフープの理由は、GUARDEDVAL が実際には、スクリプト中に作成および破棄する lvm パーティションの名前であり、このプロセスで他の (使用済みなどの) ディスク パーティションの 1 つを破棄したくないためです。偶然。

4

2 に答える 2

2

@devnull は正しい考えを持っています。関数に変換するには:

$ check_guard() { [[ $1 == GUARD_*_GUARD ]]; }

$ check_guard foo && echo OK || echo BAD
BAD
$ check_guard GUARD_foo && echo OK || echo BAD
BAD
$ check_guard foo_GUARD && echo OK || echo BAD
BAD
$ check_guard GUARD_foo_GUARD && echo OK || echo BAD
OK

大文字と小文字を区別しない場合:

$ check_guard() { local -u v=$1; [[ $v == GUARD_*_GUARD ]]; }

$ check_guard GUARD_foo_GUARD && echo OK || echo BAD
OK
$ check_guard guard_foo_GUARD && echo OK || echo BAD
OK
于 2013-10-08T14:49:13.767 に答える