(Shell 腳本)從檔案取得值時變數未正確傳遞?

(Shell 腳本)從檔案取得值時變數未正確傳遞?

我的 shell 腳本中有這部分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

這個問題似乎是由 $authKey 中的換行符或回車符和換行符引起的,由“FireEye AX”提供

您可以透過管道將回車符和換行符去掉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 是否會傳遞到子 shell...您可以在一行中嘗試它,也許它會起作用:

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

答案2

我猜測您提供的資料檔案具有 Windows 樣式的行結尾 (CR/LF),而不是 Unix/Linux 的行結尾 (LF)。

此替代模式匹配將排除任何可能的尾隨 CR:

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

相關內容