2011-08-12 69 views
0

案例1如何使用expr的功能在这种情况下[Linux的]

i="text stack" 
j="tex" 
if [[ $(expr "$i" : "$j") -ne 0 ]];then 
echo true 
fi 

案例2

i="text stack" 
j="stac" 
if [[ $(expr "$i" : "$j") -ne 0 ]];then 
echo true 
fi 

情形3

i="text stack" 
j="ext" 
if [[ $(expr "$i" : "$j") -ne 0 ]];then 
echo true 
fi 

它只能在案例1。在任何情况下,我怎样才能使它工作(并回显真实)?

回答

2

:运营商expr是一个挂靠正则表达式,即只会匹配字符串的开头(如如果你的正则表达式开始用'^')。

当你使用bash的[[内置运营商,我会写为:

i="text stack" 
j="stac" 
if [[ "$i" =~ "$j" ]]; then 
    echo true 
fi 

=~手段(从bash的手册页)...的字符串操作者的权利被认为是扩展正则表达式并相应匹配(如在正则表达式(3)中)。如果字符串匹配模式,则返回值为0,否则返回1。

+0

+1适用于:始终使用内部bash功能而不是执行相同操作的外部命令,因为产生新进程会更加昂贵。然而,这个答案可以改进一点:使用'[[$ i == * $ j *]]'因为globs比regex更有效率。与此无关,没有必要在'[[]]内部引用,因为没有发生分词。 – jw013