Bash while循环使用命令作为表达式的一部分



我正在尝试使用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):

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

<span;Operator是一个列表操作符——他将两个命令分开,只在第一个为真时执行,但在这种情况下,第一个是while,他期待的是他的do操作。然后他到达了do,而这段时间已经成为历史。你的意图是把它表达出来。所以你把它和()放在一起。例如,这是一个解决方案,只需一个小的改变>

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

相关内容

  • 没有找到相关文章

最新更新