(Shell Script) Variável não passa corretamente ao buscar valor do arquivo?

(Shell Script) Variável não passa corretamente ao buscar valor do arquivo?

Eu tenho esta seção do comando curl dentro do meu script de shell que causou um erro 500 de resposta do servidor. No entanto, esse código funciona quando executo o comando manualmente.

curl -qgsSkH "Content-Type: multipart/form-data" --no-progress-bar --header "Token: $authKey" -F "filename=@$compressedFileName" -F "options={\"application\":\"2\",\"timeout\":\"5000\"}" https://www.domain.com > results.txt

Alguém faz algum ideia do porque?

Editar: Fiz uma depuração manual e descobri que o problema é causado pela variável $authKey. Esta variável é obtida pelo seguinte código no meu script.

# Get authentication key from FireEye AX response
while read line
do
    if [[ $line =~ ^SOME-PATTERN:[[:space:]](.*) ]]
    then
        authKey="${BASH_REMATCH[1]}"
    fi
done <auth.txt

Se eu redefinir essa variável usando algo como o seguinte, o script funcionará.

authKey="TheAuthenticationKey"

Mas por que isso está acontecendo? A parte anterior em que passo a string do arquivo quando a leio linha por linha já está passando o valor correto (verifiquei novamente repetindo a saída para um arquivo txt).

Editar Consegui me aprofundar um pouco mais. Quando tento repetir o valor do token em um arquivo e adicionar " ao início e ao final da string, obtive este resultado.

"X-FeApi-Token: IDR+jxU1kB5ZpXsRNAgqfjTxkjZ0L2atH+l0H/NeatWDAJs=
"

Não tenho certeza de como remover essa nova linha. Alguém pode aconselhar?

Responder1

O problema parece ser causado por uma nova linha ou retorno de carro e nova linha em $authKey, conforme fornecido por "FireEye AX"

Você pode remover retornos de carro e avanços de linha canalizando-ostr -d '\r\n'

por exemplo

# Get authentication key from FireEye AX response
while read line
do
    if [[ $line =~ ^SOME-PATTERN:[[:space:]](.*) ]]
    then
        authKey="${BASH_REMATCH[1]}"
        authKey=$(printf "%s" "$authKey" | tr -d '\r\n')
    fi
done <auth.txt

Não me lembro se $BASH_REMATCH será passado para um subshell... você poderia tentar em uma linha, talvez funcione:

authKey=$(printf "%s" "${BASH_REMATCH[1]}" | tr -d '\r\n')

Responder2

Suponho que o arquivo de dados fornecido tenha terminações de linha no estilo Windows (CR/LF) em vez de terminações de linha Unix/Linux (LF).

Esta correspondência de padrão alternativa excluirá qualquer possível CR final:

[[ $line =~ ^SOME-PATTERN:[[:space:]](([^\015]*) ]]
authKey="${BASH_REMATCH[1]}"

informação relacionada