2017-10-14 11 views
0

私はこれをいくつかの方法で試しましたが、テキストファイルのときにこのコードに変数を渡そうとしても機能しません。奇妙なのは、それがちょうどURLだとチェックが見れば、それは完璧に動作します。whileループに変数を渡すことができません

私は、wgetの中で-iを試しました。$ lineの周りに{}を引用し、$ directoryをwgetにいくつか入れます。何もない。それは、ファイルのURLではなく、空白またはファイル名として読み取られます。

この混乱のなかで、ループの最初の部分の$ savefile.logは常にdirectory.txt.logを返します。それを修正するために$ line.logを試しました。私はそれを削除する必要があります:と\はファイル名では有効ではありません。

#!/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

ご覧ください:http://www.shellcheck.net/ – Cyrus

+0

コマンドの置換は必要ありません。 '$ '...' 'はエスケープシーケンスに限定されません。 'read -p $ 'ディレクトリまたは.txtファイルを入力してください:\ n>' directory'。 – chepner

+0

データファイルが適切なテキストファイルであることを確認してください(改行を終える)。 [[-n "$ line"]] 'スクリプトを動作させるためにハックします。 – chepner

答えて

0

EDITx2 ??:それは間違っていたので、 私の古い答えを削除し、最後に座ってコードを実行する機会を得ました、そして私は、これはそれを行う必要があるため、あなたが探していた何を考えてオフに基づいて:

#!/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 

if [[ ... ]]行の末尾に; thenを忘れていたことが大きな問題でした。

savefileを使用して、私はあなたがURL上の ".com"の後に余分を取り除き、ファイルのファイル名を与えることを目指していたと推測していますか?書かれているようにURLには完璧に動作しますが、ファイルパスは壊れます。それを書かれたように他人に移した。ファイルの場合、basenameはディレクトリを削除し、ファイル名を残すだけで、変数拡張によって面倒な '.txt'が取り除かれます。

あなたのコードからずっと逸脱しないようにしましたが、変数を引用することをお勧めします。URLにスペースは入れないでください。〜は入力が間違っていてもかまいませんが、主にファイル名がエスケープされないスペース。

また、ダブルエコーの代わりに'echo -e "\nSpidering $directory"'を使用すると、よりコンパクトにすることができます。彼らと何か間違っているとは思わないでくださいが、彼らは私のocdをバグします。 :P

最後に、バックスティックではなく、コマンド置換に新しい構文"$(echo "cmd")"を使用することをお勧めします。再び技術的に間違っているわけではありませんが、バックティックは非難されているため、最終的には動作を停止する可能性があります。また、コードをより読みやすくするために、単引用符かバックティックであるかどうかを知るためには、時々見詰める必要があります。

+0

参照してください。クリーンされた関数は機能しますが、2番目のセクションでのみ機能します。私は変数をループに渡している方法と関係があります。私は$ savefleがそれに正しく渡されていない理由についてもわかりません。 – eggdaddy

+0

@eggdaddy上記はあなたのために機能しましたか?そうでなければ、私は知っているし、他に何が出てくるのか見ていきます。 – sotI

関連する問題