作为bash脚本的新手,我决定从一开始就尝试对当前项目进行单元测试。目前,我对单行代码有疑问。我正尝试用它在目录output_json
中搜索与正则表达式匹配的文件。
在显示任何代码之前,这里是脚本运行的目录结构:
工作目录的完整路径:
C:\Users\chris\Google Drive\code projects\Replacement Program for Chile Letters\tests\general bash unit tests.
当前工作目录的目录树:
├───general bash unit tests <--(working dir)
├───node_fake_returns
└───output_json
├───email_data-1.json
├───email_data-2.json
├───email_data-3.json
├───variable_data-1.json
├───variable_data-2.json
└───variable_data-3.json
我要用来返回包含variable_data
文件的所有文件名的数组的行如下:
local contentVars=$(find "./output_json" -regextype posix-extended \
-regex '.*/output_json/variable_data-\d+.json')
这里是用于单元测试的全部功能,以防万一我在单元测试中遇到其他问题。请注意,断言函数来自shunit2。
testFileNameCapturing() {
local contentVars=$(find "./output_json" -regextype posix-extended \
-regex '.*/output_json/variable_data-\d+.json')
local emailDataVars=$(find "./output_json" -regextype posix-extended \
-regex 'variable_data-\d+.json')
assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"
}
我确定这只是一个很小的语法错误,但这确实使我停滞了整整一天的时间。任何帮助都会很棒!
答案 0 :(得分:1)
我有两个部分。关于您的正则表达式问题,以及简化单元测试代码。
在正则表达式上:
在正则表达式上,我同意GNU find对正则表达式的处理有些奇怪。
找到here的GNU find正则表达式文档。
如果使用默认的GNU find正则表达式,则可以这样编写:
▶ 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
匹配一个数字。例如here。
但是在GNU中找到posix扩展的正则表达式docs,没有提到\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