在阅读了大量文档和多个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
,而不是将其包裹在$
符号中,但仍无效。
我哪里出错了?
编辑:忽略原帖的逻辑。这最终会改变。我只是想找出正确的语法。答案 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 ))
的价值发生变化。那么测试应该做的究竟是什么呢?
您在链接答案中遵循建议的问题是您没有注意各种类型的括号/括号/等的位置。他们的意思是什么(答案并没有解释)并且这个问题中没有一个条件是命令本身。