(Shell-Skript) Variable wird beim Abrufen eines Werts aus einer Datei nicht korrekt übergeben?

(Shell-Skript) Variable wird beim Abrufen eines Werts aus einer Datei nicht korrekt übergeben?

Ich habe diesen Abschnitt des Curl-Befehls in meinem Shell-Skript, der eine Fehlerantwort 500 vom Server verursachte. Dieser Code funktioniert jedoch, wenn ich den Befehl manuell ausführe.

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

Hat jemand eine Idee, warum?

Bearbeiten: Ich habe einige manuelle Fehlerbehebungen durchgeführt und festgestellt, dass das Problem durch die Variable $authKey verursacht wird. Diese Variable wird durch den folgenden Code in meinem Skript abgerufen.

# 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

Wenn ich diese Variable etwa wie folgt neu definiere, funktioniert das Skript.

authKey="TheAuthenticationKey"

Aber warum passiert das? Der frühere Teil, in dem ich die Zeichenfolge aus der Datei übergebe, wenn ich sie zeilenweise lese, übergibt bereits den richtigen Wert (ich habe dies noch einmal überprüft, indem ich die Ausgabe in eine TXT-Datei zurückgespiegelt habe).

Bearbeiten Ich habe es geschafft, noch tiefer zu graben. Als ich versuchte, den Wert des Tokens in eine Datei zu übertragen und am Anfang und Ende der Zeichenfolge " hinzufügte, erhielt ich dieses Ergebnis.

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

Ich bin nicht sicher, wie ich dieses neue Zeilending entfernen kann. Kann mir jemand einen Rat geben?

Antwort1

Das Problem scheint durch eine neue Zeile oder einen Wagenrücklauf und eine neue Zeile in $authKey verursacht zu werden, wie von „FireEye AX“ bereitgestellt.

Sie können Wagenrückläufe und Zeilenvorschübe entfernen, indem Sie sie durchleitentr -d '\r\n'

z.B

# 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

Ich kann mich nicht erinnern, ob $BASH_REMATCH an eine Subshell übergeben wird … Sie könnten es stattdessen in einer Zeile versuchen, vielleicht funktioniert es:

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

Antwort2

Ich vermute, dass die Ihnen bereitgestellte Datendatei Zeilenenden im Windows-Stil (CR/LF) und keine Unix-/Linux-Zeilenenden (LF) hat.

Dieser alternative Mustervergleich schließt alle möglichen nachstehenden CRs aus:

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

verwandte Informationen