如何在bash中测试一个字符串是否以另一个字符串开头?

9

非常类似但不完全相同:https://dev59.com/GHI95IYBdhLWcg3wvwsQ#2172367

我使用的是Git Bash 3.1(至少在我在git bash中键入bash时提示出现的是这个版本)。

$ test [["DEV-0" == D*]] || echo 'fail' 输出 fail。

if [['DEV-0-1' == DEV* ]]; then echo "yes"; 显示 [[DEV-0-1: command not found。 我试图测试git branch是否返回以DEV开头的内容,但似乎无法应用这个答案。难道这是因为我的所有尝试都在左边使用字符串而不是变量值吗?

我还在 ideone 上尝试过http://ideone.com/3IyEND, 但没有成功。

距离我熟悉linux提示符已经过去了约14年。

我错过了什么关于在bash中测试字符串开头的内容?


1
你有语法错误,需要在 [[ 和 ]] 两侧加上空格; - jim mcnamara
如果 [['DEV-0-1' == DEV* ]] ; then echo "yes"; 也会显示[[DEV-0-1: command not found`。 - Maslow
1
啊!if [[ 'DEV-0-1' == DEV* ]] ; then echo "yes"; 看起来是可以工作的。 - Maslow
test || 语法有什么问题吗?和同样的事情吗? - Maslow
@Maslow [[ 是一个bash内置的测试语法,而test[是传统的UNIX命令(这很重要--毕竟在命令名称和其参数之间始终需要一个空格)。你只能使用其中之一;尝试将它们组合在一起,如test [[ ...是没有意义的。 - Charles Duffy
2个回答

13

那里少了一个空格:

 if [[ 'DEV-0-1' == DEV* ]]; then echo "yes"; fi
      ^^

Speedy Gonzales 是印度人 =) - Gilles Quénot
1
哈哈..我已经遇到这个错误很多次了,所以一眼就能看出来;-) - P.P
@Maslow 模式匹配仅由 [[ 支持。如果您想使用 POSIX,则必须使用 case..esac[ -z "${var##dev*}" ] - ormaaj
@Maslow 当你执行 D* 时,它会在比较之前被 shell 展开。test [[ $a == D* ]] || echo 'test fail' 是行不通的。这就是为什么你会得到那个错误。 - P.P
我有点喜欢 test condition || 语法,有没有办法将其用于字符串以某个条件开头的情况? - Maslow
1
@Maslow 你可以在这里查看我的例子:http://ideone.com/sC3bbm 。${a:0:1} 这一部分基本上是获取从索引0开始长度为1的“a”子字符串,并进行比较。同样的,你也可以用不同长度来获取不同长度的子字符串。例如 ${a:0:2} 将给出a的前两个字母。 - P.P

7

我建议这样检查:

s1=DEV-0-1
s2=DEV

if [ "${s1:0:${#s2}}" == "$s2" ]; then
  echo "yes"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接