Bash 在无限循环中使用read命令的奇怪行为

Bash 在无限循环中使用read命令的奇怪行为,bash,Bash,我有一个脚本,可以使用ls命令检查文件是否存在。如果没有文件,我会询问用户是否希望继续使用脚本 我发现read命令不包括来自终端而不是键盘的输入 这是我的剧本: function isfileThere(){ output=$(ls ${1} 2>&1 >/dev/null) case $output in *"No such file or directory"*) echo "DS not found: $output"; op

我有一个脚本,可以使用ls命令检查文件是否存在。如果没有文件,我会询问用户是否希望继续使用脚本

我发现read命令不包括来自终端而不是键盘的输入

这是我的剧本:

function isfileThere(){
  output=$(ls ${1}  2>&1 >/dev/null)
  case $output in
    *"No such file or directory"*) 
      echo "DS not found: $output";
      option_exitprog; $output >> DSNotFound.txt ;;
    *) echo "DS found: $output";;
  esac
}

function option_exitprog(){
  while :
    do
    echo -n "Would you like to continue (y/n)?"
    read Answer
    #read -n1 -p "Would you like to continue (y/n)?"   Answer                                                                                                                                                                                                                 

    if [ ! -z "$Answer" ] ; then
        if [ "$Answer" == "y" ] ; then
            echo "Exiting script. Goodbye"
            exit 1
        elif [ "$Answer" == "n" ] ; then
            echo "Continue With Program"
            break
        else
            echo "We only accept (y/n)"
        fi
    else
        echo "You have entered a null string. We only accept (y/n)"
    fi
  done
}

function get_TotalEventEntries(){

cat<<EOF                                                                                                                                                                                                                                                                 

####################################                                                                                                                                                                                                                                      
#                                  #                                                                                                                                                                                                                                      
#                                  #                                                                                                                                                                                                                                      
#        get Total Entries         #                                                                                                                                                                                                                                      
#                                  #                                                                                                                                                                                                                                      
#                                  #                                                                                                                                                                                                                                      
####################################                                                                                                                                                                                                                                      

EOF                                                                                                                                                                                                                                                                           

  while read LINE
    do
    let total_DSNumber=total_DSNumber+1

    #Check if files exist                                                                                                                                                                                                                                                   
    isfileThere ${FileDir}/*${LINE}*/*.root*

    #print to file                                                                                                                                                                                                                                                          
    #printf "${LINE}="  >> ${Filename}                                                                                                                                                                                                                                      
    #getEntries ${LINE} >> ${Filename}                                                                                                                                                                                                                                      
  done < ${DSWildCardFile}

  echo "Finished running over $total_DSNumber file(s)"
}

get_TotalEventEntries
函数isfileThere(){
输出=$(ls${1}2>&1>/dev/null)
案例$
*“无此类文件或目录”*)
回显“未找到DS:$output”;
选项_exitprog;$output>>DSNotFound.txt;;
*)回显“DS发现:$output”;;
以撒
}
函数选项_exitprog(){
而:
做
echo-n“是否继续(是/否)?”
阅读答案
#阅读-n1-p“您想继续吗(是/否)?”回答
如果[!-z“$Answer”];则
如果[“$Answer”==“y”];则
echo“退出脚本,再见”
出口1
elif[“$Answer”=“n”];然后
echo“继续执行程序”
打破
其他的
echo“我们只接受(是/否)”
fi
其他的
echo“您输入了空字符串。我们只接受(是/否)”
fi
完成
}
函数get_TotalEventEntries(){
cat${Filename}
#getEntries${LINE}>>${Filename}
完成<${DSWildCardFile}
echo“已完成运行$total\u DSNumber文件”
}
获取\u TotalEventEntries

问题出在这一行:
done<${DSWildCardFile}
。您不能使用
read
和简单重定向同时从该文件中读取行和读取用户。要修复此问题,请使用更复杂的重定向和新的文件描述符:

while read -u 3 LINE
do
  ...
done 3< ${DSWildCardFile}
读取时-u3行
做
...
完成3<${DSWildCardFile}

您的var
DSWildCardFile
在哪里定义?此外,如果你编辑你的帖子来指出预期的行为,这可能会有所帮助。您是否看到任何错误消息?你的意思是接受还是期望(而不是例外)?您是否尝试过在脚本顶部附近添加
set-vx
进行调试?祝您好运。同上,
while
循环的输入是
$DSWildCardFile
扩展到的内容。您应该更改检查文件是否存在的方法。使用:
if[-f$file]
。一般来说,如果您在脚本中使用了
ls
,那么您就是做错了。@jordanm是的,这是一种更好的方法。为什么有两个测试支架?总是被[[]和(())弄糊涂?@MWright[]是一个bash shell功能,类似于[,但功能更强大,更可能实现您的期望。(())用于数字上下文,而不限于条件(例如,它可以用于增加值
((count++)
)。以下链接应该有助于您的理解: