Bash:如何在包含多个条件的while循环中读取文件?

时间:2015-06-26 13:38:57

标签: linux bash shell unix

在阅读了大量文档和多个SO解决方案之后,我仍然无法使用read line命令在while循环中为多个条件获得正确的语法。

我在下面尝试了以下堆栈溢出解决方案无济于事。

Bash scripting, multiple conditions in while loop

!/bin/bash

while (( $(read -r line) && "$1" != 1 ))
do
  #Do stuff
done < myFile.txt

我得到的错误是((: && 8 != 1 : syntax error: operand expected (error token is "&& 8 != 1 "

还尝试了read -r line,而不是将其包裹在$符号中,但仍无效。

我哪里出错了?

编辑:忽略原帖的逻辑。这最终会改变。我只是想找出正确的语法。

2 个答案:

答案 0 :(得分:4)

我认为这里的正确语法是:

#!/bin/bash

while read -r line && (( "$1" != 1 ))
do
    # some stuff
done < myFile.txt

如果只要read成功,您希望循环运行,(( ))命令就需要超出read。也就是说,我不确定您使用的条件,因为$1是传递给您的脚本的第一个参数,它在您自己的脚本中不会发生变化。向我们展示了。

答案 1 :(得分:3)

lst = unname(split(dat, dat[,1:5])[lapply(split(dat, dat[,1:5]), nrow) != 0]) out = do.call(rbind, lapply(lst, function(x){x$EnrollmentEnd.new = x$EnrollmentEnd[nrow(x)]; x[1,]})) #> out # FirstName LastName CollegeName State PublicPrivate EnrollmentBegin #7 Jane Doe School_A IL Private 20100105 #4 John Doe School_B IL Private 20090105 #3 John Doe School_A NY Public 20050829 # EnrollmentEnd EnrollmentEnd.new #7 20100301 20101025 #4 20090301 20091025 #3 20051223 20060513 循环的语法为while 1

while compound_list do_group基本上是任何有效的命令序列。

您当前的尝试是试图粘贴命令/等。 inside 一个算术表达式,这就是你得到语法错误的原因。 compound_list的任何一个位都不是算术表达式(第二个可能是但不是必须的)。

所以你想要更像这样的东西

compound_list

或保留算术表达式而不是while read -r line && [ "$1" != 1 ] 这样的

[

话虽如此,正如Tom Fenech在帖子评论中指出的那样,您向我们展示的代码中的任何内容都不会导致while read -r line && (( "$1" != 1 )) 的价值发生变化。那么测试应该做的究竟是什么呢?

您在链接答案中遵循建议的问题是您没有注意各种类型的括号/括号/等的位置。他们的意思是什么(答案并没有解释)并且这个问题中没有一个条件是命令本身。