У меня есть 2 части. На вопрос о регулярных выражениях и на упрощение кода модульного теста.
На регулярном выражении:
Что касается регулярного выражения, я согласен, что в реализации обработки регулярного выражения в GNU find есть что-то странное.
Документация для GNU find regex найдена здесь .
Если вы используете стандартное выражение поиска GNU по умолчанию, вы можете написать это:
▶ find ./output_json -regex './output_json/variable_data-[0-9]+\.json'
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json
Однако, используя расширенный POSIX, я бы, как и вы, ожидал, что \d
будет соответствовать цифре. Это работает здесь например.
Но в GNU найти регулярное выражение с расширением posix документы нет упоминания о \d
, только [[:digit:]]
.
Таким образом, это работает:
▶ find "./output_json" -regextype posix-extended -regex './output_json/variable_data-[[:digit:]]+\.json'
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json
При исправлении вашего кода:
Я думаю, что вы должны упростить свой код и вообще избегать регулярных выражений, а просто использовать шаблон glob:
local contentVars=$(find ./output_json -name "variable_data-[0-9]*.json")
Это проще, проще для понимания и не зависит от расширения GNU, поэтому оно более переносимо.
Однако это не будет возвращать массив, но будет строка, разделенная новой строкой, и сделанное вами утверждение:
assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"
должен потерпеть неудачу. Возможно, попробуйте:
testFileNameCapturing() {
local contentVars=$(find output_json/ -name "variable_data-[0-9]*.json")
local expected="output_json/variable_data-1.json
output_json/variable_data-3.json
output_json/variable_data-2.json"
assertEquals "$expected" "$contentVars"
}
. shunit2
Выход:
testFileNameCapturing
Ran 1 test.
OK