2017-03-07 5 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 

ため、スクリプトが別のサブシェルをフォークし、サブシェルでunrar_filesを呼び出して、ここで使用パイプラインに。このサブシェルの作成により、final_resultのすべての変更は現在のシェルでは表示されません。

あなたはこのようプロセス置換を使用してそれを修正することができます:-print0

# 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) 

ノートの使用を、我々は、同様の特殊文字を含むファイルを処理できることを確認します。

は同様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" $ファイルベース "-name" * CONTR * .txt 'があります。 LINEを読みながら。同様に変更する必要がある 'unrar_files'の中で' do'を実行します。 – anubhava

+1

ああ、私はチェックしておくべきだった。それは魅力のように働く。 –

関連する問題