(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]}"

相关内容