2017-10-14 8 views
0

J'ai essayé cela de plusieurs façons, mais essayer de faire passer une variable dans ce code lorsqu'il s'agit d'un fichier texte ne fonctionne tout simplement pas. Ce qui est bizarre, c'est que si le chèque voit juste une URL, cela fonctionne parfaitement.Impossible de passer la variable dans la boucle while

J'ai essayé -i dans wget, entre guillemets $ line, {} autour de la ligne, en mettant $ directory dans wget. Rien. Il le lit comme vide ou comme nom de fichier, pas les URL dans le fichier.

En plus de ce désordre, $ savefile.log dans la première partie de la boucle retourne toujours directory.txt.log. J'ai essayé $ line.log pour corriger cela et nada. J'ai besoin de lui dénudé comme: et \ ne sont pas valides dans un nom de fichier.

#!/bin/bash 

    read -p "Enter directory or .txt file: `echo $'\n> '`" directory 

    savefile=$(echo "${directory//"http://"}" | cut -d '/' -f1) 

    if [[ $directory == *.txt ]] 
    echo 
    echo "Spidering $directory" 
     while IFS='' read -r line || [[ -n "$line" ]]; do 
      echo "$line" 
      wget -np --spider -e robots=off --no-check-certificate $line 2>> $savefile.log 
      echo 
      echo "Spider saved to $savefile.log" 
     done < $directory 
    else 
     echo 
     echo "Spidering $directory" 
     wget -r -np --spider -e robots=off --no-check-certificate $directory 2>> $savefile.log 
     echo 
     echo "Spider saved to $savefile.log" 
fi 
+2

Veuillez jeter un coup d'œil: http://www.shellcheck.net/ – Cyrus

+0

La substitution de commande n'est pas nécessaire; '$ '...'' n'est pas limité aux séquences d'échappement. 'read -p $ 'Entrez le répertoire ou le fichier .txt: \ n>' directory'. – chepner

+0

Assurez-vous que vos fichiers de données sont des fichiers texte appropriés (avec une nouvelle ligne de fin), et vous n'aurez pas besoin de '|| [[-n "$ line"]] 'pirater pour que le script fonctionne. – chepner

Répondre

0

EDITx2 ??: Retrait ma vieille réponse parce qu'il avait tort, finalement eu la chance de s'asseoir et exécuter le code, et de ce que je basé PENSE que vous recherchez cela devrait le faire:

#!/bin/bash 

read -p "Enter directory or .txt file: `echo $'\n> '`" directory 

if [[ $directory == *.txt ]]; then 
    echo 
    echo "Spidering $directory" 
    while IFS='' read -r line || [[ -n "$line" ]]; do 
     echo "$line" 
     savefile="$(basename "${directory//.txt}")" 
     wget -np --spider -e robots=off --no-check-certificate $line 2>> $savefile.log 
     echo 
     echo "Spider saved to $savefile.log" 
    done < $directory 
else 
    echo 
    echo "Spidering $directory" 
    savefile=$(echo "${directory//"http://"}" | cut -d '/' -f1) 
    wget -r -np --spider -e robots=off --no-check-certificate $directory 2>> $savefile.log 
    echo 
    echo "Spider saved to $savefile.log" 
fi 

Un gros problème était que vous avez oublié le ; then à la fin de la ligne if [[ ... ]].

Avec savefile, je devine que vous visiez à dépouiller supplémentaire après le ".com" sur une URL et donner juste le nom de fichier d'un fichier? Fonctionne parfaitement pour une url comme écrit, mais il nukes le chemin du fichier. Déplacé dans l'autre comme écrit. Pour un fichier, basename supprime les répertoires et laisse simplement le nom de fichier et l'extension de variable décompose le '.txt' gênant. J'ai essayé de ne pas dévier de votre code de beaucoup, mais je recommande de citer les variables - ne devrait pas être des espaces dans l'URL, mais ~ pourrait être ~ si entrée incorrecte, mais surtout parce que les noms de fichiers pourraient avoir des espaces non échappés .

Pourrait également rendre un peu plus compact en utilisant 'echo -e "\nSpidering $directory"' au lieu des doubles échos. Ne supposez rien de mal avec eux, mais ils bug mon ocd. : P

Enfin, je recommanderais d'utiliser la syntaxe plus récente pour la substitution de commande, "$(echo "cmd")" au lieu des backticks. Encore une fois pas techniquement faux, mais comme les back-ticks sont déconseillés, ils peuvent éventuellement cesser de fonctionner. Aussi, et plus encore, je dirais, cela rend le code plus lisible, je dois parfois plisser les yeux pour savoir s'il s'agit d'une simple citation ou d'une citation en arrière.

+0

Voir, la fonction nettoyée fonctionne, mais seulement dans la deuxième section. Cela doit être fait avec la façon dont je passe la variable dans la boucle. Je ne suis même pas sûr que $ savefle ne passe pas correctement. – eggdaddy

+0

@eggdaddy Ce qui précède a-t-il fonctionné pour vous? Si non, pourtant, je le sais et je verrai ce que nous pouvons trouver d'autre. – sotI