【发布时间】:2011-05-07 03:50:09
【问题描述】:
对于固定的前缀长度,我可以这样做:
[ a${filename:0:2} = a.# ] && echo temporary emacs file
任意前缀怎么办?
有没有更清洁的方法?
【问题讨论】:
对于固定的前缀长度,我可以这样做:
[ a${filename:0:2} = a.# ] && echo temporary emacs file
任意前缀怎么办?
有没有更清洁的方法?
【问题讨论】:
这里是 Ignacio 答案的“正则表达式”版本(2015,bash 3.x 和更新版本),使用运算符 =~:
[[ "1234" =~ ^12 ]] && echo y
如果您需要来自变量的动态前缀:
var=12
[[ "1234" =~ ^$var ]] && echo y
当使用复杂的正则表达式时,您可以将它们放在自己的变量中:
var=12
var2=a
regex="^${var}.+${var2}.+$"
[[ "1234a567" =~ $regex ]] && echo y
另见'Conditional Constructs' section of the Bash man page on 命令[[:
另外一个二元运算符 =~ 可用,其优先级与 == 和 != 相同。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex(3) 中所示)。如果字符串与模式匹配,则返回值为 0,否则为 1。如果正则表达式在语法上不正确,则条件表达式的返回值为 2。如果启用了 shell 选项 nocasematch,则不考虑字母字符的大小写进行匹配。由正则表达式中带括号的子表达式匹配的子字符串保存在数组变量 BASH_REMATCH 中。 BASH_REMATCH 的索引为 0 的元素是匹配整个正则表达式的字符串部分。 BASH_REMATCH 中索引为 n 的元素是字符串中匹配第 n 个带括号的子表达式的部分。
【讨论】:
[[ 的= 运算符在右操作数中采用模式。
var=123
[[ 1234 = $var* ]] && ...
【讨论】:
[[ ${var_to_test}a = ${prefix}*a ]] && ...?
a; [[ 没有与test 相同的限制。