0

特定のテキストのすべてのヘッダー ファイルを検索し、各ヘッダー ファイルが他のファイルに含まれる回数を調べる UNIX シェル スクリプトを作成しようとしています。

私の問題は 2 番目の部分にあります。他のファイルのインクルードを検索するコマンドはコマンド ラインから機能しますが、シェル スクリプトからは何も出力しません。

array=( $(grep  'regexToSearch' -rl --include="*.h" pathToFiles) )

for item in "${array[@]}"
do
    filename=$(echo ${item} | grep -o '[^/]*.h')
    incstring="#include[ ]*\"$filename\""
    echo $incstring
    echo "--------------------"
    filelist=$(grep '$incstring' -rl --include=*.{h,cpp} pathToFiles)
    echo $filelist
    echo "--------------------"
done

出力は次のとおりです。

#include[ ]*"header1.h"
--------------------
// Second grep output for first file should be here
--------------------
#include[ ]*"header2.h"
--------------------
// Second grep output for second file should be here
--------------------
#include[ ]*"header3.h"
--------------------
// Second grep output for third file should be here
--------------------
4

2 に答える 2

0

このコマンドでは一重引用符を使用しています。

    filelist=$(grep '$incstring' -rl --include=*.{h,cpp} pathToFiles)

一重引用符は、変数の展開を禁止します。$incstringつまり、その変数の内容ではなく、リテラル文字列を探しています。このコマンドは、ここに示すように、コマンド ラインでも機能しません

bash(1)マニュアルページから:

文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが前にある場合でも、単一引用符の間に単一引用符が出現しない場合があります。

一重引用符を二重引用符に置き換えます。

    filelist=$(grep "$incstring" -rl --include=*.{h,cpp} pathToFiles)
于 2013-08-02T13:21:31.940 に答える