for loop:命令每次从begin开始

时间:2014-02-17 14:44:40

标签: bash loops if-statement for-loop

我编写了以下bash脚本来检查domain.list中的域列表和dir.list中的多个目录。

@是第一个域,它首先尝试查找文件 http://example.com 如果成功脚本完成并退出没问题。

如果失败则去检查 https://example.com 如果确定,脚本完成并退出, 如果不 检查一下 http://example.com/$list个不同的目录。

如果找到文件脚本并退出,则无法找到 然后去看看吧 不同目录的https://example.com/$list

但问题是,当第一次检查失败并且第二次检查失败时,它进入第三次检查,但它继续循环,在第三个命令和第四个命令,告诉它查找文件或已完成的目录列表。

我希望脚本在到达第3个命令时运行它并在目录列表中检查它,告诉列表完成,而不是去第4个命令告诉它完成

在我的脚本中,它一直在多个目录中检查单个域,每次检查一个新目录,它从bagain启动整个脚本,并从头开始再次运行第一个命令和第二个命令,我不需要,大量的时间浪费

谢谢

#!/bin/bash
dirs=(`cat dir.list`)
doms=( `cat domain.list`)
for dom in "${doms[@]}"
do
for dir in "${dirs[@]}"
do
target1="http://${dom}"
target2="https://${dom}"
target3="http://${dom}/${dir}"
target4="https://${dom}/${dir}"

if curl -s --insecure -m2 ${target1}/test.txt | grep "success" > /dev/null ;then
echo ${target1} >> dir.result
break
elif curl -s --insecure -m2 ${target2}/test.txt | grep "success"  > /dev/null;then
echo ${target2} >> dir.result
break
elif  curl -s --insecure -m2 ${target3}/test.txt | grep "success"  > /dev/null; then
echo ${target3} >> dir.result
break
elif  curl -s --insecure -m2 ${target4}/test.txt | grep "success" > /dev/null ; then
echo ${target4} >> dir.result
break
fi
done
done

2 个答案:

答案 0 :(得分:1)

您的代码不是最佳的;如果你有5个'dir'值的列表,你检查5次是否存在http://${domain}/test.txt - 但是如果它第一次不存在,则可能是其他时间也不存在。

您使用dir表示子目录名称,但您的代码使用http://${dom}:${dir}而不是更正常的http://${dom}/${dir}。从技术上讲,冒号后面的第一个斜杠是端口号,而不是目录。我将假设这是一个错字,结肠应该用斜线代替。

一般情况下,请勿使用反蜱符号;请改用$(…)。避免重复编码。

我认为你可以将你的脚本压缩成这样的东西:

#!/bin/bash
dirs=( $(cat dir.list) )
file=test.txt

fetch_file()
{
    if curl -s --insecure -m2 "${1:?}/${file}" | grep "success" > /dev/null
    then
        echo "${1}"
        return 0
    else
        return 1
    fi
}

for dom in $(cat domain.list)
do
    for proto in http https
    do
        fetch_file "${proto}://{$dom}" && break
        for dir in "${dirs[@]}"
        do
            fetch_file "${proto}://${dom}/${dir}" && break 2
        done
    done
done > dir.result

如果域名列表很大,您可以考虑使用while read dom; do …; done < domain.list而不是$(cat domain.list)。定义变量site="${proto}://${dom}"然后在fetch_file的调用中使用它是可行的,甚至可能是明智的。

答案 1 :(得分:0)

您可以使用此脚本:

while read dom; do
   while read dir; do
      target1="http://${dom}"
      target2="https://${dom}"
      target3="http://${dom}:${dir}"
      target4="https://${dom}:${dir}"

      if curl -s --insecure -m2 ${target1}/test.txt | grep -q "success"; then
         echo ${target1} >> dir.result
         break 2
      elif curl -s --insecure -m2 ${target2}/test.txt | grep -q "success"; then
         echo ${target2} >> dir.result
         break 2
      elif curl -s --insecure -m2 ${target3}/test.txt | grep -q "success"; then
         echo ${target3} >> dir.result
         break 2
      elif curl -s --insecure -m2 ${target4}/test.txt | grep -q "success"; then
         echo ${target4} >> dir.result
         break 2
      fi
   done < dir.list
done < domain.list