(シェル スクリプト) ファイルから値を取得するときに変数が正しく渡されませんか?

(シェル スクリプト) ファイルから値を取得するときに変数が正しく渡されませんか?

シェル スクリプト内に curl コマンドのこのセクションがあり、サーバーからエラー 500 応答が発生しました。ただし、コマンドを手動で実行すると、このコードは機能します。

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

理由が分かる人はいますか?

編集: 手動でデバッグしてみたところ、問題は変数 $authKey によって発生していることがわかりました。この変数は、スクリプト内の次のコードによって取得されます。

# 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

次のような方法でこの変数を再定義すると、スクリプトは機能します。

authKey="TheAuthenticationKey"

しかし、なぜこのようなことが起こるのでしょうか? 行ごとに読み取るときにファイルから文字列を渡す前の部分では、すでに正しい値が渡されています (出力を txt ファイルにエコーして二重に確認しました)。

編集 さらに掘り下げることができました。トークンの値をファイルにエコーし、文字列の先頭と末尾に " を追加しようとすると、この結果が得られました。

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

新しい行を削除する方法がわかりません。どなたかアドバイスをいただけませんか?

答え1

この問題は、「FireEye AX」によって提供される$authKey内の改行または復帰改行によって発生するようです。

パイプ処理によって復帰改行文字を取り除くことができる。tr -d '\r\n'

例えば

# 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

$BASH_REMATCH がサブシェルに渡されるかどうかは覚えていません...代わりに 1 行で試してみると、うまくいくかもしれません:

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

答え2

提供されたデータ ファイルには、Unix/Linux の行末 (LF) ではなく、Windows スタイルの行末 (CR/LF) が含まれていると思われます。

この代替パターン マッチでは、末尾の CR が除外されます。

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

関連情報