Bash Shell脚本嵌套循环(在for循环中)不起作用
在我的shell脚本中,它正确地执行内部循环,但只执行外部循环一次 请检查我的脚本,为什么它不工作 操作系统:AmazonEC2Linux 我创建了shell脚本,用于从目录中删除文件,其中包含文件名, 在我创建的TXT文件中不存在Bash Shell脚本嵌套循环(在for循环中)不起作用,bash,shell,sh,Bash,Shell,Sh,在我的shell脚本中,它正确地执行内部循环,但只执行外部循环一次 请检查我的脚本,为什么它不工作 操作系统:AmazonEC2Linux 我创建了shell脚本,用于从目录中删除文件,其中包含文件名, 在我创建的TXT文件中不存在 for entry in "/home/ec2-user/upload/upload/*" do exist=false file="/home/ec2-user/upload/requiredjpg.txt" while IFS= rea
for entry in "/home/ec2-user/upload/upload/*"
do
exist=false
file="/home/ec2-user/upload/requiredjpg.txt"
while IFS= read -r line
do
if [ "$line" = "$entry" ]
then
echo "same"
else
echo "not same"
fi
done <"$file"
echo $exist
if [ $exist = false ]
then
echo $exist
fi
done
用于输入“/home/ec2 user/upload/upload/*”
做
存在=错误
file=“/home/ec2 user/upload/requiredjpg.txt”
而IFS=读取-r行
做
如果[“$line”=“$entry”]
然后
回声“相同”
其他的
回声“不一样”
fi
完成在内环中有错误的“完成”。“如果”语句应在其下
while IFS= read -r line
do
if [ "$line" = "$entry" ]
表达式“/home/ec2 user/upload/upload/*”
被逐字解释为字符串/home/ec2 user/upload/upload/*
。显然,您希望将其扩展为与通配符表达式匹配的路径数组。但是,在双引号中,星号字符具有不同的含义,--它仅用于(在所讨论的表达式中不存在)
你真正需要的是。要激活它,只需将星号字符置于双引号外:
"/home/ec2-user/upload/upload/"*
请注意,在这个特定字符串中不需要双引号,因为其中没有任何需要转义(引号)的特殊字符。对此表示抱歉。OP最初粘贴了一个我转录成文本的图像。我错过了do
。它存在于原始代码中。但是这一部分:如果[ $Le] =“$条目”,它总是把两个变量看作不相等的,即使它是相等的,任何人都知道原因吗?“亨德拉,我不确定我理解你正在做什么,但是表达式[Cord] > [ $行] =“$条目”]。
比较字符串并在且仅当字符串相等时返回true。问题中的代码迭代(假定)/home/ec2 user/upload/upload/
目录中的所有文件,然后将文件路径与/home/ec2 user/upload/requiredjpg.txt中的每行文本进行比较。您可能真的想将“/home/ec2 user/upload/requiredjpg.txt”
(作为字符串)与“$entry”
进行比较;在这种情况下,您不需要while
循环。@Hendra,我还建议打印更多信息,不仅仅是相同的和不相同的,而是像printf“%s等于%s\n'$line”“$entry”这样的内容。或者,您可以使用set-x
命令打开调试模式。@Hendra,您可以检查$exist
变量的值,但不要在初始化后将其设置在任何位置。此外,您可能希望在“找到文件”时中断循环。是的,如果您只搜索特定的路径/文件名,那么find
命令会更方便,例如:find/home/ec2 user/upload/upload/-type f-name'requiredjpg.txt'