You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本异常:grep -ci/-ni结果未写入文件而是输出到终端

问题分析与修复方案

你的脚本核心问题出在引号嵌套错误和命令语法混乱,导致grep -ci/grep -ni的输出无法正确写入文件,反而直接输出到终端。以下是具体问题点和修复后的完整脚本:

关键问题点

  1. 引号拆分命令:在写入文件的grep -ci/-ni语句中,单引号的错误使用导致grep命令被拆分成多个部分,参数解析失败,部分输出直接流向终端。
  2. 错误的转义字符:代码中的"是HTML转义字符,在Bash中无效,应该用双引号包裹带空格的变量。
  3. 重定向逻辑隐患:重定向>> $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

修复细节说明

  1. 引号统一处理:用双引号包裹sh -c的整个命令内容,内部变量用单引号包裹,避免带空格的变量被拆分。
  2. 重定向移至内部:将>> '$printfile'放在sh -c的命令字符串内,确保由abc_mgr用户执行文件写入,避免权限冲突。
  3. 修正正则表达式:searchstringa的生成去掉多余的转义,直接写[[:space:]]即可,Bash中无需额外转义方括号。
  4. 语法规范:修复if语句的语法错误(原代码缺少分号),添加脚本头#!/bin/bash,增强兼容性。

内容的提问来源于stack exchange,提问作者Rubberducky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:25:09