Bash脚本异常:grep -ci/-ni结果未写入文件而是输出到终端
问题分析与修复方案
你的脚本核心问题出在引号嵌套错误和命令语法混乱,导致grep -ci/grep -ni的输出无法正确写入文件,反而直接输出到终端。以下是具体问题点和修复后的完整脚本:
关键问题点
- 引号拆分命令:在写入文件的
grep -ci/-ni语句中,单引号的错误使用导致grep命令被拆分成多个部分,参数解析失败,部分输出直接流向终端。 - 错误的转义字符:代码中的
"是HTML转义字符,在Bash中无效,应该用双引号包裹带空格的变量。 - 重定向逻辑隐患:重定向
>> $printfile放在sudo外部时,是当前用户执行写入;若printfile仅允许abc_mgr用户操作,会触发权限问题(你这里其他命令看似正常,是因为引号错误刚好没触发权限问题,但逻辑上不严谨)。
修复后的完整脚本
#!/bin/bash # 用户输入 echo "INPUT THE STRING TO SEARCH FOR" && echo && read searchstring # 生成精确匹配的正则:空格替换为[:space:],支持任意空白符 searchstringa="${searchstring// /[[:space:]]}" # 终端输出部分 echo -e "\e[1;36mCount of exact matches:\e[0m" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -cw '$searchstringa'" echo -e "\e[1;36mCount of vague matches:\e[0m" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -ci '$searchstring'" echo "**************************************" echo -e "\e[1;36mCase sensitive matches:\e[0m" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -nw '$searchstringa'" echo "**************************************" echo -e "\e[1;36mCase insensitive matches:\e[0m" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -ni '$searchstring'" # 写入文件确认 echo -e "\nInput PRINT to print results to results.txt or Ctrl +C to quit" && echo && read printoutput printfile="/users/search/results.txt" if [[ $printoutput = "PRINT" ]]; then # 所有写入操作放在sh -c内部,确保abc_mgr权限 sudo -u abc_mgr sh -c "cd /users/search/; echo -e 'Count of exact matches:\n' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -cw '$searchstringa' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; echo -e '\nCount of vague matches:\n' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -ci '$searchstring' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; echo -e '\n******************************\n' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; echo -e 'Exact matches:\n' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -nw '$searchstringa' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; echo -e '\nCase insensitive matches:\n' >> '$printfile'" sudo -u abc_mgr sh -c "cd /users/search/; strings datafile1.DAT | grep -ni '$searchstring' >> '$printfile'" echo -e "\n**************************************" echo "Results written to $printfile" else echo "Operation cancelled." fi
修复细节说明
- 引号统一处理:用双引号包裹
sh -c的整个命令内容,内部变量用单引号包裹,避免带空格的变量被拆分。 - 重定向移至内部:将
>> '$printfile'放在sh -c的命令字符串内,确保由abc_mgr用户执行文件写入,避免权限冲突。 - 修正正则表达式:
searchstringa的生成去掉多余的转义,直接写[[:space:]]即可,Bash中无需额外转义方括号。 - 语法规范:修复
if语句的语法错误(原代码缺少分号),添加脚本头#!/bin/bash,增强兼容性。
内容的提问来源于stack exchange,提问作者Rubberducky
相关产品推荐
相关产品推荐

