1

我正在尝试编写一个 bash 脚本来搜索我的源目录中使用的字符串grep——不,我不能使用ack.

目录结构是

标头: .../产品/package/product-模块/i/文件名.h

来源:.../产品/package/product-模块/s/文件名.c

我想要指定或不指定模块的选项(搜索所有模块),这是参数点$2。问题是,我无法在脚本中工作*$2"*$2"工作(请参见下文)。

编辑:前一种尝试没有任何输出,后者导致“grep:没有这样的文件或目录”

如果我想将它与另一个字符串复合,我该*如何正确使用它?grep

#!/bin/bash

# Usage: search_src -[si] < module | all > < target >

if [ $1 == "-s" ]; then
   fext="c"
   subdir="s"
elif [ $1 == "-i" ]; then
   fext="h"
   subdir="i"
else
   fext="[ch]"
   subdir="[si]"
fi

if [ $2 == "all" ]; then
   module=*;
else
   module=*$2;
fi

shift 2;

grep \"$@\" ~/workspace/*/package/$module/$subdir/*.$fext
4

1 回答 1

3

只需使用安全的评估和一些小的修改:

#!/bin/bash

# Usage: search_src -[si] < module | all > < target >

if [[ $1 == "-s" ]]; then
   fext="c"
   subdir="s"
elif [[ $1 == "-i" ]]; then
   fext="h"
   subdir="i"
else
   fext="[ch]"
   subdir="[si]"
fi

if [[ $2 == "all" ]]; then
   module='*';
else
   module='*"$2"';
fi

shopt -s nullglob
eval "files=(~/workspace/*/package/$module/$subdir/*.$fext)"

IFS=$' \t\n'
[[ $# -gt 2 && ${#files[@]} -gt 0 ]] && grep -e "${*:3}" -- "${files[@]}"
于 2013-09-20T21:54:09.783 回答