bash while while with command作为表达式的一部分?

时间:2011-04-05 16:04:14

标签: bash while-loop

我正在尝试使用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上打开了一个文件。)

2 个答案:

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

  1. 从一系列进程中检索单个退出代码,或从一系列命令中检索单个输出流。例如,(echo "Hi" ; echo "Bye") | sed -e "s/Hi/Hello/"将打印两行“Hello”和“Bye”。这是获取多个echo语句以生成单个流的最简单方法。
  2. 将命令评估为变量:$(expr 1 + 1)将充当变量,但会生成值2
  3. 执行数学运算:$((5 * 4 / 3 + 2 % 1))将像变量一样进行评估,但会计算该数学表达式的结果。

答案 1 :(得分:2)

&& operator是一个列表操作符 - 他分隔两个命令,只在第一个为真时执行,但在这种情况下,第一个是while,他期待他做的事情。然后他伸手去做,而那段时间已经是历史了。 你的意图是把它放到表达式中。所以你把它放在一起()。例如。这只是一个小改动的解决方案

while ( read -u 4 line  && test "$line" != "$header_line" )