【问题标题】:How to test that a variable starts with a string in bash?如何测试变量是否以bash中的字符串开头?
【发布时间】:2011-05-07 03:50:09
【问题描述】:

对于固定的前缀长度,我可以这样做:

[ a${filename:0:2} = a.# ] && echo temporary emacs file

任意前缀怎么办?

有没有更清洁的方法?

【问题讨论】:

标签: bash string


【解决方案1】:

这里是 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 个带括号的子表达式的部分。

【讨论】:

    【解决方案2】:

    [[ 的= 运算符在右操作数中采用模式。

    var=123
    [[ 1234 = $var* ]] && ...
    

    【讨论】:

    • 你的意思是[[ ${var_to_test}a = ${prefix}*a ]] && ...?
    • 最后不需要a; [[ 没有与test 相同的限制。
    • 你是对的。如果左侧有一个变量,即使它为空,表达式仍然有效(我很困惑,因为我已经在 shell 中测试了它,而 lhs 上没有任何名称,所以它会产生语法错误;但是在脚本中总会有一些变量名。)
    猜你喜欢
    • 2014-01-15
    • 2013-03-03
    • 2015-04-15
    • 2010-10-22
    • 2018-04-04
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多