2015-11-30 3 views
-1

Как проверить строку в пути к файлу в bash? Я пытаюсь:Bash - проверить строку в пути к файлу

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

, чтобы заменить все косые черты двоеточием (:) в пути. Это не работает. Bash видит строку пути файла как путь к файлу и выдает ошибку «Нет такого файла или каталога». Цель состоит в том, чтобы увидеть путь к файлу в виде строки.

Пример: filePathVar может быть

**/myloc/SRC/File.java

в этом случае проверка должна возвращать верно.

Обратите внимание, что я пишу этот скрипт внутри задания 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' будет _allways_ содержать текст' 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. Он все еще не работает в контексте Дженкинса и выдает сообщение об ошибке «Нет такого файла или каталога». Я хочу, чтобы сравнение происходило чисто как контекст String без оценки файла или каталога, производимого Bash. – naspras

+0

@naspras Моя цель состояла в том, чтобы это работало для вас под bash. Я вижу, что вы добавили вопрос о том, что это должно быть сделано «внутри задания Дженкинса как шаг сборки». К сожалению, я не знаком с Дженкинсом. Ошибка при получении ошибки Jenkins или ошибки bash? – John1024

+0

это ошибка bash. Дженкинс выполняет сценарий как скрипт оболочки. – naspras