字符串应该具有相同的值,但事实并非如此

时间:2011-12-14 19:03:38

标签: string shell unix loops zsh

您好,我正在尝试阅读文件夹中的几个文件的几行“帖子”文件夹中的html文件帖子可能如下所示:

<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 个答案:

答案 0 :(得分:2)

对于后人:这个答案并没有完全解决原始海报的问题,一定有一些环境问题在起作用。

  

由于article仅在for循环中定义,因此在done之后未定义...

     

你可以在article=循环开始之前抛出一行:=for之后没有任何内容),以使变量超出范围。

     

基本上,在循环内“创建”的任何东西只会持续到循环退出。

     

http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Lexical_scoping超过你想知道的词法范围和朋友。)

为了未来可能有类似问题的读者的利益:

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,()

不知道实际上可能导致这个问题的原因是什么,只是很高兴它消失了......