0

TEST で grep を使用すると (18 行目)、完全に機能します。まったく同じコマンドを実行しても、for ループ内 (40 行目) では機能しません。なんで?私はこの問題に頭を悩ませてきました。

#!/bin/bash
clear           

sourcelist=`ls *.c`
headerlist=`ls *.h`
FILE="headers.txt"

TEST="receive_elevator_data" #this is one typical entry in headers.tex
echo "TEST"
grep $TEST *.c -n

MODE="h"

if [ "$MODE" = "h" ]
then
echo "Searching.."
#for entry in $(cut -f 1 $FILE)
for entry in `cat $FILE`
    do
    echo "Looking at entry in $FILE: "
    echo $entry
    echo "Press any button to search, <s> for skip, <e> to exit"
    read -e INPUT2
    if [ "$INPUT2" = "s" ]
    then
        continue
    fi
    if [ "$INPUT2" = "n" ]
    then
        exit 1 #exit shell script
    else
        grep -n "${entry}" ${sourcelist}
    fi
done
fi

明確にするために: headers.txt のすべての行には、「test」のような文字列があります。つまり、行にスペースはありません。headers.txt に実際に含まれているのは、C プロジェクトのすべてのヘッダーファイルから抽出された関数名のリストです:) 以前のコードではエラーは返されませんでした。実行されなかったのはループ内の grep コマンドだけでした。私がやりたいことは、headers.txt の各関数についてすべての C ファイルを検索し、各検索の前にプロンプ​​トを表示することです。

4

1 に答える 1

3

grepファイル名にスペースが含まれているため、おそらく失敗します。

大文字の変数を使用しないでください。それらは環境によってよりよく使用されます。出力
を解析しようとしないでください。ls代わりにグロビングを使用してください。
あなたがbashを書いているなら、よりも優先[[して[ください。読ま
ないでください。cat file代わりreadに while ループに入れます。
常に変数を引用してください。また、グループ化すると見つけやすくなります。
ファイルのリストを配列として扱います。ネストできるprefer
を使用し、それを引用する必要がある場合 ( )``$()foo="$(cmd ..)"

#!/bin/bash
clear           

sourcelist=(*.c)
headerlist=(*.h)
file="headers.txt"
test="receive_elevator_data" # this is one typical entry in headers.tex
mode="h"

echo "searching test"
grep -n "$test" "${sourcelist[@]}"

if [[ "$mode" == "h" ]]; then
    echo "Searching.."
    while read -r entry; do
        printf "Looking at entry in %s: %s\n" "$file" "$entry"
        read -p "Press any button to search, <s> for skip, <e> to exit" -e answer
        [[ "$answer" = "s" ]] && continue
        [[ "$answer" = "e" ]] && exit 1 # exit shell script
        grep -n "$entry" "${sourcelist[@]}"
    done < "$file"
fi
于 2012-04-21T23:11:38.873 に答える