2017-03-07 1 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 "$ filebase"-name "* CONTR * .txt '| 읽는 동안 LINE; 비슷하게 변경 될 필요가있는'unrar_files' 내부에서'do'를 호출합니다. – anubhava

+1

오, 확인 했어야합니다. 그것은 매력처럼 작동합니다. –

관련 문제