我想实现一个简单的检查,检查字符串变量的值是否是用户提供或生成的。
到目前为止,“算法”只是在生成字符串时将“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分区的名称,而我宁愿不销毁其中一个(例如使用过的)磁盘分区在这个过程中意外。
答案 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