2015-11-30 38 views
-1

如何检查bash中文件路径中的字符串?我想:Bash - 检查文件路径中的字符串

if [[$(echo "${filePathVar}" | sed 's#//#:#g#') == *"File.java"* ]] 

更换所有期待与冒号(:)路径斜杠。它不工作。 Bash将文件路径字符串视为文件路径,并引发错误“No such file or directory”。目的是让它将文件路径看作一个字符串。

实施例:filePathVar可能是

**/myloc/SRC/File.java

在这种情况下,检查应返回true。

请注意,我在Jenkins作业中编写此脚本作为构建步骤。

Updates as of 12/15/15

下返回Not found,这是不对的。

#!/bin/bash 
sources="**/src/TESTS/A.java **/src/TESTS/B.java" 

if [[ "${sources}" = ~B.java[^/]*$ ]]; 
then 
echo "Found!!" 
else 
echo "Not Found!!" 
fi 

下面返回Found这也还错(除去各处比较=的空间)。

#!/bin/bash 
sources="**/src/TESTS/A.java **/src/TESTS/C.java" 

if [[ "${sources}"=~B.java[^/]*$ ]]; 
then 
echo "Found!!" 
else 
echo "Not Found!!" 
fi 

比较操作显然不起作用。

+0

替换所有斜杠与结肠癌:'$ {// filePathVar \ //}'。但你为什么要这么做? – 4ae1e1

+0

'#s#//#:#g#''有双斜杠... – Jahid

+0

请看更新的问题。 – naspras

回答

1

它的工作如下一个简单的方法:

#!/bin/bash 
sources="**/src/TESTS/A.java **/src/TESTS/B.java" 
if [[ $sources == *"A.java"* ]] 
then 
echo "Found!!" 
else 
echo "Not Found!!" 
fi 
+0

在此代码中,变量'sources'将_always_包含文本'A.java'。还要注意_pathname expansion_在'[[...]]'内被抑制。因此,此代码将始终返回'Found !!'。 – John1024

+0

变量来源实际上是从其他地方获取它的值,并且分配给它的字符串也会变化。我只是举了一个例子。 – naspras

2

它更容易使用bash的内建正则表达式匹配设施:

$ filePathVar=/myLoc/src/File.java 
if [[ "$filePathVar" =~ File.java[^/]*$ ]]; then echo Match; else echo No Match; fi 
Match 

[[...]],操作=~确实正则表达式匹配。正则表达式File.java[^/]*匹配任何包含File.java的字符串,可选地跟随除/之外的任何字符串。

+0

谢谢@ John1024。它在Jenkins的上下文中仍然不起作用,并且抛出错误说“没有这样的文件或目录”。我希望比较纯粹作为一个String上下文而没有Bash所做的文件或目录评估。 – naspras

+0

@naspras我的目标是在bash下为你工作。我看到你增加了这样的问题,即“在Jenkins的工作内部完成这一步”。不幸的是,我对詹金斯并不熟悉。是你得到一个詹金斯错误或bash错误的错误? – John1024

+0

这是一个bash错误。詹金斯纯粹将脚本作为shell脚本执行。 – naspras