给出以下变量:
context_object_name = 'object_blog'
我需要在var=abcd
中写些什么,以便将if
与其他变量进行比较,使它们以var
开头,但也许与(在最多)还有一个字母(最后一个)?
例如:
我希望以下情况能使我成真:
与abcd
相关的var
。
与abcd
相关的var
。
与abcde
相关的var
。
以下情况会给我带来错误:
与abcdk
相关的var
。
与abc
相关的var
。
答案 0 :(得分:3)
使用纯POSIX,您可以检查变量本身是否等于abcd
,或者变量减去其最后一个字母是否相等。
if [ "$var" = abcd ] || [ "${var%?}" = abcd ]; then
使用bash
的{{1}},您可以使用扩展模式匹配
[[ ... ]]
(其中if [[ $var = abcd@(|?) ]]; then
与空字符串或单个任意字符完全匹配)
或正则表达式匹配
@(|?)
(其中if [[ $var ~= ^abcd.?$ ]]; then
匹配一个可选字符。.?
和^
分别匹配字符串的开头和结尾,从而限制了匹配的长度)。
答案 1 :(得分:2)
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