Используйте переменную из цикла read - PullRequest
3 голосов
/ 03 марта 2012

В моем скрипте bash я использую цикл while read и вспомогательную функцию fv():

fv() {
    case "$1" in
    out) echo $VAR
    ;;
    *  ) VAR="$VAR $1"
    ;; 
    esac
}

cat "$1" | while read line
    do
        ...some processings...
        fv some-str-value
    done

echo "`fv out`"

в надежде, что смогу извлечь значение из цикла while read в переменную, доступную в остальной частисценарий.Но приведенный выше фрагмент не годится, так как я не получаю вывод.

Есть ли простой способ решить эту проблему - вывести строку из этого цикла в переменную, которая будет доступна в остальной части сценария - без переформатирования моего сценария?

Ответы [ 3 ]

5 голосов
/ 03 марта 2012

Как никто не объяснил вам , почему ваш код не работал, я буду.

Когда вы используете cat "$1" |, вы выполняете этот цикл в подоболочке. Переменная VAR, используемая в этой подоболочке, начинается как копия VAR из основного сценария, и любые изменения в ней ограничиваются этой копией (областью действия подоболочки), они не влияют на исходный сценарий VAR. Удаляя бесполезное использование cat , вы удаляете конвейер, и поэтому цикл выполняется в основной оболочке, так что он может (и делает) изменять правильную копию VAR.

4 голосов
/ 03 марта 2012

Замените ваш цикл while на while read line ; do ... ; done < $1:

#!/bin/bash

function fv
{
    case "$1" in
    out) echo $VAR
    ;;
    *  ) VAR="$VAR $1"
    ;; 
    esac
}

while read line
    do
        fv "$line\n"
    done < "$1"

echo "$(fv out)"
1 голос
/ 03 марта 2012

Прекратить читать трубопровод.

done < "$1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...