2012-04-21 3 views
0

Когда я использую grep в TEST (строка 18), он отлично работает. Когда я выполняю ту же самую команду, но внутри цикла for (цикл 40), это не работает. Зачем? Я слишком долго изогнул свой мозг по этой проблеме.Сценарий оболочки Linux: grep не работает внутри for-loop

#!/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 имеет строки, как «тест», т.е. без пробелов в линиях. Что действительно содержит файл headers.txt, это список имен функций, извлеченных из всех файлов заголовков в проекте C :) В моем предыдущем коде не было возвращенной ошибки, это была только команда grep в цикле, которая не запускалась. То, что я хочу сделать, - это поиск по всем файлам C для каждой функции в headers.txt и запрос перед каждым поиском

+0

'СЭД 's/^/\ т /' сценарий | xclip', и вы готовы вставить;) – c00kiemon5ter

+0

Выберите код и нажмите на маленькие фигурные скобки? –

+0

также, что это за ошибка? вы должны включить эту информацию. – c00kiemon5ter

ответ

3

grep, вероятно, не работает, потому что имя файла содержит пробелы.

не используем прописная буква vars. они лучше используются окружающей средой.
никогда не пытайтесь разобрать ls выход. вместо этого используйте globbing.
если вы используете баш, тогда предпочитаете [[ над [.
не cat file, чтобы прочитать его. вместо этого read это в цикле while.
всегда указывайте свои переменные. их также легче найти, если они сгруппированы.
обрабатывать список файлов, как массив.
если вы должны использовать `` предпочитают $(), которые могут быть вложенными, а также процитировать его (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 
+0

Все хорошие предложения (+1) ... Re: * backquotes * vs '$()' .. backquotes также обрабатывают некоторые экранированные символы по-разному .. Из 'info bash': * Когда форму обратной подстановки в старом стиле используется обратная косая черта сохраняет свое буквальное значение, за исключением случаев, когда следуют $, 'или or. Первый обратный запрос , которому предшествует обратная косая черта, завершает команду sub . При использовании формы $ (command) все символы между скобками составляют команду; никто не обрабатывается специально. * –

+0

Tnx! Код выглядит аккуратно, но не работает - по крайней мере, не так, как предполагалось. Просто уточнить: каждая строка в headers.txt имеет строки типа «test», то есть нет пробелов в строках. Что действительно содержит файл headers.txt, это список имен функций, извлеченных из всех файлов заголовков в проекте C :) В моем предыдущем коде не было возвращенной ошибки, это была только команда grep в цикле, которая не запускалась. То, что я хочу сделать, - это поиск по всем файлам C для каждой функции в headers.txt и запрос перед каждым поиском. Этот код не запрашивал мою систему (единство ubuntu) – Lars

Смежные вопросы