Строка должна иметь то же значение, но это не так - PullRequest
2 голосов
/ 14 декабря 2011

Привет! Я пытаюсь прочитать несколько строк из нескольких файлов в папке "posts". HTML-файл в папке posts может выглядеть следующим образом:

<h1>stackoverflow</h1>
<h3>14.12.11</h3>

Blbalbla some text here.

Это код на данный момент...

cd posts
for f in *
do
    aname=$(echo "$f" | sed 's/\(.*\)\..*/\1/')
    headline="<h1><a href="\"#$aname\"">$(sed -n 1p $f)</a></h1>"
    postdate="<h3>$(sed -n 2p $f)</h3>"
    article="$headline $postdate $(sed -n '4,$p' $f)"
    echo "$article"
done
cd ..
echo "$article"

Основная проблема заключается в том, что первый эхо-сигнал в строке 8 не отображает то же содержимое, что и эхо-сигнал в последней строке ... но строки слишком должны иметь одинаковое значение / я хочустрока, имеющая то же значение в последней строке, что и в строке 8 ...

1 Ответ

2 голосов
/ 14 декабря 2011

Для потомков: Этот ответ не совсем решил вопрос оригинального плаката, должно быть, были некоторые проблемы с окружающей средой при работе.

Поскольку article определяется тольков цикле for он не определен после done

Вы можете просто бросить строку: article= (ничего после =) перед началом цикла for, чтобы получитьпеременная вне области действия.

По сути, все, «созданное» внутри цикла, длится только до выхода из цикла.

(http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Lexical_scoping больше, чем вы хотитезнать о лексической области видимости и друзьях.)

В интересах будущих читателей, у которых может быть похожая проблема:

Это неверно in bash, do/done не создает лексическую область видимости, если не используется ().Тем не менее, похоже, что правильно для некоторых версий или настроек для zsh (согласно последующим комментариям от первоначального автора);но в конфигурации по умолчанию для Fedora 15, равной zsh, она соответствует приведенному ниже поведению, как и bash (область не вложена без ())

for x in 1 2 3; do
    n="$x foo"
    echo -n "$n,"
done
echo "($n)"

1 foo,2 foo,3 foo,(3 foo)

for x in 1 2 3; do (
    n="$x foo"
    echo -n "$n,"
); done
echo "($n)"

1 foo,2 foo,3 foo,()

Я не знаю что могло на самом деле вызвать проблему, вызвавшую эту проблему, просто рад, что она ушла ...

...