如何检查变量(除最后一个字母外)是否等于其他变量?

时间:2018-07-05 22:38:09

标签: bash

给出以下变量:

context_object_name = 'object_blog'

我需要在var=abcd 中写些什么,以便将if与其他变量进行比较,使它们以var开头,但也许与(在最多)还有一个字母(最后一个)?

例如:

我希望以下情况能使我成真:
abcd相关的var
abcd相关的var
abcde相关的var

以下情况会给我带来错误:
abcdk相关的var
abc相关的var

3 个答案:

答案 0 :(得分:3)

使用纯POSIX,您可以检查变量本身是否等于abcd,或者变量减去其最后一个字母是否相等。

if [ "$var" = abcd ] || [ "${var%?}" = abcd ]; then

使用bash的{​​{1}},您可以使用扩展模式匹配

[[ ... ]]

(其中if [[ $var = abcd@(|?) ]]; then 与空字符串或单个任意字符完全匹配)

或正则表达式匹配

@(|?)

(其中if [[ $var ~= ^abcd.?$ ]]; then 匹配一个可选字符。.?^分别匹配字符串的开头和结尾,从而限制了匹配的长度)。

答案 1 :(得分:2)

Bash中的

The [[ command默认情况下会对字符串进行模式匹配,因此您可以使用?*some other metacharacters来匹配一个(任意,但恰好一个) ?,带有*的零个或多个字符,等等。例如:

$ [[ abcde == abcd? ]] && echo yes || echo no
yes
$ [[ abcdefg == abcd* ]] && echo yes || echo no
yes
$ [[ abc == abcd? ]] && echo yes || echo no
no
$ [[ abcd == abcd? ]] && echo yes || echo no
no

请注意,该值在左侧,模式在右侧。另外,[[支持使用||&&之类的逻辑运算符,因此您可以像这样组合它们:

ref=abcd
val=abcde
if [[ $val == $ref || $val == $ref? ]]; then
    # match
fi

答案 2 :(得分:0)

您还可以在bash中使用字符串索引进行其他选择。您可以简单地检查变量的前4个字母是否与abcd相匹配,并检查变量长度是否大于5,例如

if [[ abcd = ${var:0:4} ]] && [[ ${#var} -le 5 ]]; then
    ## condition true
fi

bash中有许多选项。您甚至可以通过将测试字符串存储在变量中,然后使用 length 代替上面的每个数字,例如

,使上述测试更为通用。
test_string="abcd"
len=${#test_string}

if [[ $test_string = ${var:0:$((len))} ]] && [[ ${#var} -le $((len+1)) ]]; then
    ## condition true
fi