如何测试变量以bash中的字符串开头?

tho*_*mas 29 string bash

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

[ a${filename:0:2} = a.# ] && echo temporary emacs file
Run Code Online (Sandbox Code Playgroud)

如何为任意前缀做到这一点?

有更干净的方式吗?

Ign*_*ams 46

[[=运营商需要在正确的操作模式.

var=123
[[ 1234 = $var* ]] && ...
Run Code Online (Sandbox Code Playgroud)

  • 你最后不需要`a`; `[[`与`test`没有相同的限制. (3认同)

t0r*_*r0X 22

这里是Ignacio答案的'正则表达式'版本(2015年,bash 3.x和更新版本),使用运算符=~:

[[ "1234" =~ ^12 ]] && echo y
Run Code Online (Sandbox Code Playgroud)

如果您需要来自变量的动态前缀:

var=12
[[ "1234" =~ ^$var ]] && echo y
Run Code Online (Sandbox Code Playgroud)

使用复杂的正则表达式时,可以将它们放在自己的变量中:

var=12
var2=a
regex="^${var}.+${var2}.+$"
[[ "1234a567" =~ $regex ]] && echo y
Run Code Online (Sandbox Code Playgroud)

另请参阅命令上Bash手册页'Conditional Constructs'部分[[:

可以使用另一个二元运算符=〜,其优先级与==和!=相同.使用它时,操作符右侧的字符串被视为扩展正则表达式并相应地匹配(如在regex(3)中).如果字符串与模式匹配,则返回值为0,否则返回1.如果正则表达式在语法上不正确,则条件表达式的返回值为2.如果启用了shell选项nocasematch,则执行匹配而不考虑字母字符的情况.与正则表达式中带括号的子表达式匹配的子字符串保存在数组变量BASH_REMATCH中.索引为0的BASH_REMATCH元素是与整个正则表达式匹配的字符串部分.