我正在尝试使用bash读取文件的一部分并停止和特定行。我不是很熟悉bash,但我一直在阅读手册和各种参考资料,我不明白为什么像下面这样的东西不起作用(而是产生语法错误):
while { read -u 4 line } && (test "$line" != "$header_line")
do
echo in loop, line=$line
done
我想我可以写一个循环来测试一个"完成"变量,然后在循环内做我真正的测试,并适当地设置"完成",但我很好奇,1)为什么上面不工作,2)是否有一些小的纠正,将使它工作?对于何时使用[,(,{,或(),我仍然相当困惑,所以也许其他一些组合可以工作,尽管我已经尝试了几个。
(注意:当我在循环上面调用它时,"read -u 4 line"工作得很好。我在文件描述符4上打开了一个文件)
我想你应该是这样的:
while read -u 4 line && test "$line" != "$header_line"
do
...
done
大括号({}字符)用于在不能使用空格时将变量与字符串的其他部分分开。例如,echo "${var}x"
将打印变量var
的值,然后是x
,但echo "$varx"
将打印变量varx
的值。
括号([]字符)用作test
程序的快捷方式。[
是test
的另一个名字,但是当test
检测到它被[
调用时,它需要一个]
作为它的最后一个参数。关键是清晰。
括号(()字符)在许多不同的情况下使用。它们通常启动子shell,尽管并非总是如此(我不确定这里的情况#3):
- 从一系列进程中检索单个退出代码,或从命令序列中检索单个输出流。例如,
(echo "Hi" ; echo "Bye") | sed -e "s/Hi/Hello/"
将打印两行,"Hello"one_answers"Bye"。这是获得多个echo语句来生成单个流的最简单方法。 - 将命令当作变量来评估:
$(expr 1 + 1)
将像变量一样工作,但将产生值2
。 - 执行数学:
$((5 * 4 / 3 + 2 % 1))
将像变量一样计算,但将计算该数学表达式的结果。
<span;Operator是一个列表操作符——他将两个命令分开,只在第一个为真时执行,但在这种情况下,第一个是while,他期待的是他的do操作。然后他到达了do,而这段时间已经成为历史。你的意图是把它表达出来。所以你把它和()放在一起。例如,这是一个解决方案,只需一个小的改变>
while ( read -u 4 line && test "$line" != "$header_line" )