如何用数组中的关键词批量运行pdfgrep并分别保存结果?
批量PDF关键词搜索脚本修复方案
需求
在PDF文件中搜索多个不同关键词,通过pdfgrep实现批量遍历数组中的每个关键词执行搜索,并将每个关键词的搜索结果保存到单独文件中。
原脚本
#!/bin/bash function search_elements(){ array=("$@") for i in "${array[@]}"; do pdfgrep -Hir ' "$i" ' . done } array = ("gomma" "lacca" "bromo") search_elements "$(array[@])"
ShellCheck检测到的错误
- 第5行:SC2034(警告):
i未被使用,请确认使用情况(若外部使用则需导出)。 - 第7行:SC2016(提示):单引号内的表达式不会展开,需使用双引号。
- 第11行:SC2283、SC1036、SC1088(错误):赋值时
=两侧不能有空格,此处括号使用无效,解析在此处终止。
修正后的脚本
#!/bin/bash function search_elements(){ # 接收传入的关键词数组 local keywords=("$@") for keyword in "${keywords[@]}"; do # 搜索关键词并将结果保存到对应文件 pdfgrep -Hir "$keyword" . > "${keyword}_results.txt" done } # 正确定义关键词数组(=两侧无空格) keywords_array=("gomma" "lacca" "bromo") # 正确传递数组参数给函数 search_elements "${keywords_array[@]}"
修复细节说明
- 数组赋值错误修复:Shell里变量赋值时
=前后不能加空格,原脚本array = (...)会被当成命令执行,改成keywords_array=("gomma" "lacca" "bromo")即可正常定义数组。 - 变量展开问题修复:单引号会阻止Shell解析变量,原脚本
' "$i" '无法替换成实际关键词,改用双引号包裹"$keyword",确保关键词能正确传入pdfgrep。 - 函数参数传递修复:原脚本
search_elements "$(array[@])"是错误的写法,正确传递数组的方式是search_elements "${keywords_array[@]}",这样每个数组元素会作为独立参数传给函数。 - 结果保存实现:新增
> "${keyword}_results.txt",把每个关键词的搜索结果输出到以关键词命名的文件里,满足“每个关键词结果存单独文件”的需求。 - 变量可读性优化:把循环变量从
i改成keyword,既消除了SC2034的警告(变量被实际使用),也让代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者Andrea Colaci
相关产品推荐
相关产品推荐

