您好,我正在尝试阅读文件夹中的几个文件的几行“帖子”文件夹中的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行的最后一行......
答案 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,()
我不知道实际上可能导致这个问题的原因是什么,只是很高兴它消失了......