高效/简洁检查变量内容的开头/结尾

时间:2013-10-08 14:26:27

标签: string bash

我想实现一个简单的检查,检查字符串变量的值是否是用户提供或生成的。

到目前为止,“算法”只是在生成字符串时将“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分区的名称,而我宁愿不销毁其中一个(例如使用过的)磁盘分区在这个过程中意外。

2 个答案:

答案 0 :(得分:3)

  

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

一种方法是说:

[[ $VAL == ${GUARD}*${GUARD} ]] && echo ok

答案 1 :(得分: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