2013-08-05 4 views
1

Я пытаюсь изменить скрипт bash, чтобы выполнить несколько проверок и поисков CMS, которые использует моя компания. Я пытаюсь реализовать функцию для пользователя, чтобы иметь возможность искать определенный вызов макроса, и функция возвращает все файлы, содержащие вызов, линию, на которую вызывается макрос, и фактический код в вызове макроса. То, что я, кажется, смущен тем, что я использую цикл for для форматирования вывода. Вот отрывок из сценария, я работаю над:Как предотвратить использование цикла в качестве разделителя, сценарий bash

elif [ "$choice" = "2" ] 
then 
    echo -e "\n What macro call are we looking for $name?" 
    read macrocall 
    for i in $(grep -inR "$macrocall" $sitepath/templates/macros/); do 
    file=$(echo $i | cut -d\: -f1 | awk -F\/ '{ print $NF }') 
    line=$(echo $i | cut -d\: -f2) 
    calltext=$(echo $i | cut -d\: -f3-) 
    echo -e "\nFile: $file" 
    echo -e "\nLine: $line" 
    echo -e "\nMacro Call from file: $calltext" 
    done 
fi 

текущий скрипт запускает первые несколько полей до тех пор, пока не получит место, а потом все становится все чокнутый. Кто-нибудь есть идеи, как я могу использовать ограничитель для циклов для каждого результата grep? Любые предложения будут полезны. Дайте мне знать, если кто-то из вас нуждается в дополнительной информации. Благодаря!

ответ

1

Вы можете установить внутренний разделитель поля $IFS (который обычно устанавливается в пространство, вкладки и новой строки) только символ новой строки, чтобы обойти эту проблему:

IFS="\n" 
+1

Ну, это было легко. СПАСИБО! –

2

Правильный способ сделать это будет больше похоже :

printf "\n What macro call are we looking for %s?" "$name" 
read macrocall 

# ensure globbing is off and set IFS to a newline after saving original values 
oSET="$-"; set -f; oIFS="$IFS"; IFS=$'\n' 

awk -v macrocall="$macrocall" ' 
    BEGIN { lc_macrocall = "\\<" tolower(macrocall) "\\>" } 
    tolower($0) ~ lc_macrocall { 
     file=FILENAME 
     sub(/.*\//,"",file) 
     printf "\n%s\n", file 
     printf "\n%d\n", FNR 
     printf "\nMacro Call from file: %s\n", $0 
    } 
' $(find "$sitepath/templates/macros" -type f -print) 

# restore original IFS and globbing values 
IFS="$oIFS"; set +f -"$oSET" 

Это решает проблему наличия пробелов в именах файлов, как предлагалось первоначально, но и обрабатывает подстановку символов в именах файлов, а также различные типичные echo вопросы.

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