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 分区的名称,我宁愿在此过程中不销毁其他(例如使用过的)磁盘分区之一意外地。

4

2 回答 2

3

我的问题是:我可以以某种方式检查值两端是否存在字符串吗?

一种方法是说:

[[ $VAL == ${GUARD}*${GUARD} ]] && echo ok
于 2013-10-08T14:34:14.107 回答
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 回答