2017-10-14 69 views
0

我已經嘗試了這幾種方法,但試圖將一個變量傳遞給此代碼時,它是一個文本文件不起作用。奇怪的是,如果支票看到它只是一個網址,它完美的作品。不能將變量傳入while循環

我試過在wget的-i,報價約爲$線,{}左右線,把$目錄的幾種方式進入的wget。沒有。它將其讀取爲空白或作爲文件名稱,而不是文件中的URL。

在這混亂的頂部,在循環的第一部分$ savefile.log總是返回directory.txt.log。嘗試$ line.log來解決這個問題和nada。我確實需要將它剝離爲:和\在文件名中無效。

#!/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>'目錄'。 – 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」後,給只是一個文件的文件名?作爲一個完美的網址寫作,但它核武的文件路徑。按照書面將其移入else。對於一個文件,basename刪除目錄,只是將文件名和變量擴展條留下了麻煩的'.txt'。

儘量不要偏離您的代碼太多,但我會建議引用變量 - 不應該是URL中的空格,但〜可以〜如果輸入錯誤,但主要是因爲文件名可能有未轉義的空格。

也可以使利用'echo -e "\nSpidering $directory"'代替雙回聲一點點更緊湊。不要認爲他們有什麼問題,但他們會錯誤地發現我的ocd。 :P

最後,我會建議使用較新的語法命令替換,"$(echo "cmd")"而不是反引號。再次,技術上不是錯誤的,但由於反蜱不推薦使用,它們最終可能停止工作。另外,我想說的更多,它使代碼分配更多的可讀性,我不得不斜視,以確定它是單引號還是反碼。

+0

請參閱清理後的功能,但僅限於第二部分。它必須用我將變量傳入循環的方式來完成。我甚至不確定爲什麼$ savefle沒有正確傳入。 – eggdaddy

+0

@eggdaddy爲你做了上述工作?如果沒有,但我知道,我會看看我們還能想出什麼。 – sotI