2017-03-07 31 views
1

我有一個搜索unrar文件密碼的bash腳本。我想連接結果並在腳本的末尾通知執行結果,但我不知道爲什麼final_result var輸出「INIT-END」。在bash腳本中連接var的錯誤

爲什麼不在search_pass_and_unrar函數中連接?

#!/bin/bash 

# Url for finding rar files 
url_hdd="/media/HDD" 
final_result="INIT-" 

unrar_files(){ 

    filebase=`dirname "$1"` 
    url_rar="$1" 
    url_for_pass="" 

    # Search files for password 
    find "$filebase" -name '*CONTR*.txt' | while read LINE; do 

     # Convert Windows line ending 
     $(sed -i 's/^M//g' "$LINE") 

     # Get url where we can find file password 
     url_for_pass=$(cat "$LINE" | grep -Eo '(http|https)://[^?"]+') 

     search_pass_and_unrar "$url_for_pass" "$url_rar" "$filebase" 

    done 

} 

search_pass_and_unrar(){ 

    final_url="$1" 
    pass=$(curl -s -S -L "$final_url" | grep 'name="txt_password"' | grep -oP 'value="\K[^"]+') 

    if [[ -z "$pass" ]] 
    then 
     final_result+="Error, password not found" 
     return 
    fi 

    result_unrar=$(unrar e "${2}" "${3}" -p"${pass}") 
    final_result+="Result: ${result_unrar}" 


} 

# Find rar files and call unrar_files function 
find "$url_hdd" -type f -name "*.rar" | while read LINE; do 
    unrar_files "$LINE" 
done 

final_result+="END" 
echo "$final_result" # "INIT-END" 

非常感謝,最好的問候。

回答

1

問題是在這裏:

# Find rar files and call unrar_files function 
find "$url_hdd" -type f -name "*.rar" | while read LINE; do 
    unrar_files "$LINE" 
done 

由於這裏用你的腳本分叉另一個子shell和子shell調用unrar_files管道。由於此子shell的創建,所有對final_result所做的更改在當前shell中都不可見。

您可以通過使用進程替換這樣的修正:

# Find rar files and call unrar_files function 
while IFS= read -d '' -r LINE; do 
    unrar_files "$LINE" 
done < <(find "$url_hdd" -type f -name '*.rar' -print0) 

注意使用-print0以確保我們能夠處理的文件包含特殊字符爲好。

同樣裏面unrar_files你需要這樣的:

while IFS= read -d '' -r LINE; do 

    # Convert Windows line ending 
    $(sed -i 's/^M//g' "$LINE") 

    # Get url where we can find file password 
    url_for_pass=$(cat "$LINE" | grep -Eo '(http|https)://[^?"]+') 

    search_pass_and_unrar "$url_for_pass" "$url_rar" "$filebase" 

done < <(find "$filebase" -name '*CONTR*.txt' -print0) 
+0

謝謝您的回答。我不知道是否有錯別字,我複製了你的代碼,結果是一樣的。 –

+0

你有另一個'find'$ filebase「-name'* CONTR * .txt'|同時讀取LINE;在'unrar_files'裏面'需要改變類似的。 – anubhava

+1

哦,我應該檢查一下。它像一個魅力。 –