while循环在附加文件bash中提前中断

while循环在附加文件bash中提前中断,bash,shell,file,ubuntu,while-loop,Bash,Shell,File,Ubuntu,While Loop,我正在用bash编写脚本,在附加文件中循环文件时遇到一些问题 代码示例: #! /bin/bash printFlag=false while test $# -gt 0; do case "$1" in -p) shift printFlag=true ;; *) shift ;; esac done #Setting up the printFile for i in {1..50} do echo $i >

我正在用bash编写脚本,在附加文件中循环文件时遇到一些问题 代码示例:

#! /bin/bash

printFlag=false

while test $# -gt 0; do
 case "$1" in

  -p)
   shift
   printFlag=true
  ;;

  *)
   shift
  ;;
 esac 
done

#Setting up the printFile
 for i in {1..50}
 do
  echo $i >> printFile
 done

 echo ' ' >> printFile

 for i in {150..200}
 do 
  echo $i >> printFile
 done

 echo ' ' >> printFile


#print the file

if $printFlag
then

 #problem here (wont print the whole file)
 while read line
 do
 #Modify the line here... 
 echo $line      
 done < printFile


else
 #prints the whole file 
 cat printFile
fi

rm printFile

exit 0
#/bin/bash
printFlag=false
而测试$#-gt 0;做
案件“$1”
-(p)
转移
printFlag=true
;;
*)
转移
;;
以撒
完成
#设置打印文件
对于{1..50}中的i
做
echo$i>>打印文件
完成
回显'>>打印文件
对于{150..200}中的i
做
echo$i>>打印文件
完成
回显'>>打印文件
#打印文件
如果$printFlag
然后
#此处出现问题(无法打印整个文件)
读行时
做
#在这里修改行。。。
回音$线
完成<打印文件
其他的
#打印整个文件
cat打印文件
fi
rm打印文件
出口0
如果printFlag为false,则按预期打印

如果printFlag为true,则输出将在文件附加EOF的50和“”之后停止

我认为它是在添加EOF时出现的,while循环在中中断,但不知道如何继续

我需要while循环在EOF之后继续读取文件的其余部分

我尝试了不同的读取[-r,-d…]设置,但没有任何效果


我是bash新手,我希望我已经很好地解释了这个问题,让您能够理解

bash没有任何布尔值的概念-没有可以通过$printFlag变量传递给if语句的真/假值

bash没有任何布尔值的概念-没有可以传递给if的真/假值语句通过$printFlag变量

在我的机器上,两个版本都可以工作。不过,我想知道,如果
cat
有效,那么不使用它的原因是什么?您能解释一下$printFlag是如何设置的以及如何使用它吗?也许这会澄清为什么
cat
不是一个可行的解决方案。如果文件需要修改,printfag将为true,否则只需打印它,这就是while循环和逐行读取的原因1)您可能正在查看以前运行的错误代码,请在脚本顶部添加一个
>printfile
。2) 是的,错误的EOF(Ctrl-D)似乎是可能的,但不清楚为什么会发生。用一个可以显示十六进制值的编辑器检查您的
打印文件
,以确认该假设。祝你好运我试着用-xxd和hextump调试这个文件,但没有发现任何异常,只是有很多换行符(ASCII:0a),我想bash中没有隐藏的填充或类似的东西?(在谷歌上找不到太多)并添加了>printfile,但没有进一步的成功。然而,我在while循环if中找到了一个临时解决方案![-z“${line}”];然后#正常代码。。。否则将回显“”fi,这样它将跳过确定为空的行并回显空的,而不是在我的计算机上工作,这两个版本都可以工作。不过,我想知道,如果
cat
有效,那么不使用它的原因是什么?您能解释一下$printFlag是如何设置的以及如何使用它吗?也许这会澄清为什么
cat
不是一个可行的解决方案。如果文件需要修改,printfag将为true,否则只需打印它,这就是while循环和逐行读取的原因1)您可能正在查看以前运行的错误代码,请在脚本顶部添加一个
>printfile
。2) 是的,错误的EOF(Ctrl-D)似乎是可能的,但不清楚为什么会发生。用一个可以显示十六进制值的编辑器检查您的
打印文件
,以确认该假设。祝你好运我试着用-xxd和hextump调试这个文件,但没有发现任何异常,只是有很多换行符(ASCII:0a),我想bash中没有隐藏的填充或类似的东西?(在谷歌上找不到太多)并添加了>printfile,但没有进一步的成功。然而,我在while循环if中找到了一个临时解决方案![-z“${line}”];然后#正常代码。。。否则,将回显“”fi,这样它将跳过确定为空的行并回显一个空的行,而不是它工作。这只是一个较小的代码片段,以缩小问题的范围。打印标志只是在while和cat函数之间进行指示,我将其作为一个参数添加。请相应地调整它,有些人试图在本地重现该问题。您还可以缩小范围并在开始处添加#/bin/bash-x一步一步地调试您的脚本如果
printfag=true(或false)
它将由
if
语句正确地进行计算。刚刚在Ubuntu和Debian上测试了这两个版本。所有4个案例都按预期工作。这只是缩小问题范围的一小部分代码。打印标志只是在while和cat函数之间进行指示,我将其作为一个参数添加。请相应地调整它,有些人试图在本地重现该问题。您还可以缩小范围并在开始处添加#/bin/bash-x一步一步地调试您的脚本如果
printfag=true(或false)
它将由
if
语句正确地进行计算。刚刚在Ubuntu和Debian上测试了这两个版本。所有4个案例都按预期工作。