Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本嵌套循环(在for循环中)不起作用_Bash_Shell_Sh - Fatal编程技术网

Bash Shell脚本嵌套循环(在for循环中)不起作用

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

在我的shell脚本中,它正确地执行内部循环,但只执行外部循环一次

请检查我的脚本,为什么它不工作

操作系统:AmazonEC2Linux

我创建了shell脚本,用于从目录中删除文件,其中包含文件名, 在我创建的TXT文件中不存在

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'