Skip to content
Advertisement

Error concatenating var in bash script

I have a bash script that searchs for password for unrar files. I would like to concatenate result and at the end of the script notify result of execution, but I donĀ“t know why final_result var outputs “INIT-END”.

Why does not concatenate in search_pass_and_unrar function?

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

Thanks a lot, best regards.

Advertisement

Answer

Problem is here:

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

Due to pipeline used here your script is forking another subshell and calling unrar_files in a subshell. Due to this subshell creation all the changes made to final_result are not visible in current shell.

You can fix it by using process substitution like this:

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

Note use of -print0 to make sure we can process files with special characters as well.

Similarly inside unrar_files you need to this:

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)
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement