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