【问题标题】:Using Environment Variables in cURL Command - Unix在 cURL 命令中使用环境变量 - Unix
【发布时间】:2015-11-04 23:49:26
【问题描述】:

我的问题很简单。我想在类似这样的 cURL 命令中使用环境变量:

curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"$USERNAME","password":"$PASSWORD"}' 

当我运行命令时,$USERNAME 作为“$USERNAME”字符串而不是变量的值传递给命令。有没有办法摆脱这种情况?

谢谢。

【问题讨论】:

    标签: linux shell unix curl environment-variables


    【解决方案1】:

    单引号禁止变量替换,所以使用双引号。然后必须对内部双引号进行转义。

    ...  -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
    

    【讨论】:

    • 立即工作。非常感谢!
    • 这救了我...有史以来最好的答案!
    【解决方案2】:

    为了减少引用,改为从标准输入读取。

    curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
    { "username": "$USERNAME", "password": "$PASSWORD"}
    EOF
    

    -d @foo 从名为foo 的文件中读取。如果您使用- 作为文件名,它将从标准输入中读取。在这里,标准输入是从一个 here 文档中提供的,它被视为一个双引号字符串,而实际上并没有用双引号括起来。

    【讨论】:

    • 其实我在 Jenkins 中使用这个命令,所以我没有机会以这种方式使用它。参数通过配置文件注入到命令中。但是,仍然感谢您的知识。
    【解决方案3】:
    curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'
    

    这里的变量放在"'" 引号之外,并且会被shell 扩展(就像在echo $USERNAME 中一样)。例如假设USRNAME=xxxPASSWORD=yyy传递给curl的argv[7]字符串是{"username":"xxx","password":"yyy"}

    是的,当 $USERNAME 或 $PASSWORD 包含空格字符时,这将不起作用。

    【讨论】:

    • 我不确定示例中到底有什么不清楚的地方——这只是外壳。 )
    【解决方案4】:

    我们的:curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'"$USERNAME"'","password":"'"$PASSWORD"'"}'

    【讨论】:

    • 即使在 USERNAME, PASSWORD 包含空格的情况下也能正常工作(虽然这不太可能)
    【解决方案5】:

    你可以用"'"包装环境变量,你应该为外部json对象保留单引号。

    例如

     -d '{"username":"'"$USERNAME"'","password":"'"$PASSWORD"'"}' 
    

    【讨论】:

    • 这是从上面的两个响应中复制粘贴,没有附加价值...
    猜你喜欢
    • 2015-04-09
    • 2012-04-19
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2015-04-07
    • 2017-02-09
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多