我正在尝试使用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上打开了一个文件。)
答案 0 :(得分:5)
我认为你想要的更像是这样:
while read -u 4 line && test "$line" != "$header_line"
do
...
done
大括号({}字符)用于在无法使用空格时将变量与字符串的其他部分分开。例如,echo "${var}x"
将打印变量var
的值,后跟x
,但echo "$varx"
将打印变量varx
的值。
括号([]字符)用作test
程序的快捷方式。 [
是test
的另一个名称,但当test
检测到它被[
调用时,它需要]
作为其最后一个参数。关键是清晰。
括号(()字符)用于许多不同的情况。它们通常会启动子壳,但并非总是如此(我在这里确实不确定#3):
(echo "Hi" ; echo "Bye") | sed -e "s/Hi/Hello/"
将打印两行“Hello”和“Bye”。这是获取多个echo语句以生成单个流的最简单方法。$(expr 1 + 1)
将充当变量,但会生成值2
。$((5 * 4 / 3 + 2 % 1))
将像变量一样进行评估,但会计算该数学表达式的结果。答案 1 :(得分:2)
&& operator是一个列表操作符 - 他分隔两个命令,只在第一个为真时执行,但在这种情况下,第一个是while,他期待他做的事情。然后他伸手去做,而那段时间已经是历史了。 你的意图是把它放到表达式中。所以你把它放在一起()。例如。这只是一个小改动的解决方案
while ( read -u 4 line && test "$line" != "$header_line" )