使用.sh脚本定义Content-Type运行curl

9

我尝试运行test.sh脚本时,curl总是报错:

curl: (6) Couldn't resolve host 'application'

test.sh:

#!/bin/sh
CT="Content-Type:\ application/json"

TEST="curl http://127.0.0.1 -H $CT"
echo $TEST

RESPONSE=`$TEST`
echo $RESPONSE

但是,如果我只是从控制台运行以下命令,一切都很好:

curl http://127.0.0.1 -H Content-Type:\ application/json

您好,请问脚本中出了什么问题,我理解是与“空格”转义有关,但不知道该如何修复。

此外,我尝试过以下组合,但结果相同:

CT="Content-Type: application/json"
TEST="curl http://127.0.0.1 -H \"$CT\""

更新:

bash / dash 仅在服务器上可用。(/bin/sh --> bash)

GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu)

奇怪...对我来说很好用..请添加您的 curl -V 输出 - Kuf
天啊,这是Bash。sh是链接到Bash。 - kaspian
GNU bash,版本4.2.10(1)-release(x86_64-pc-linux-gnu) 版权所有(C)2011年自由软件基金会 许可证GPLv3 +:GNU GPL第3版或更高版本http://gnu.org/licenses/gpl.html这是免费软件;您可以自由更改和重新分发它。 在法律允许的范围内,没有任何保证。 - kaspian
是的 :) 在原始的 Unix 系统上,SH 是一个独立的 shell。从那时起,出现了许多变体,如 BASH、TCSH、CSH、SASH、KSH、DASH 等等。大多数 shell 脚本使用链接 "#!/bin/sh",使脚本能够在不必特别调用 sh <script> 的情况下执行。 - Kuf
可能是 http://stackoverflow.com/questions/3187614/bash-curl-eval-and-whitespace?rq=1 的重复。 - java4africa
显示剩余3条评论
2个回答

20

运行以下代码:(删除 Content-Type 后面的空格)

#!/bin/bash
CT="Content-Type:application/json"

TEST="curl http://127.0.0.1 -H $CT"
echo $TEST

RESPONSE=`$TEST`
echo $RESPONSE

服务器不同意 :( - kaspian
什么错误?它在我这里可以工作。如果错误很长,请将其粘贴到此处,否则只需在此处编写即可。 - Kuf
@user1613658,请尝试将 #!/bin/bash 替换为 #!/bin/dash#!/bin/sh。您确定不需要更多的shell吗?请尝试 cat /etc/shells - Kuf
有一个很长的“可用shell”列表,但它们在文件系统中找不到。只有bash和dash存在。我尝试了切换它们,但结果仍然一样。我真的很困惑。 - kaspian
我也很困惑...上面的代码在我的bash会话中可以工作,而且应该也适用于你..那么错误信息是什么? - Kuf
抱歉,生成JSON请求时出现了问题。现在已经正常工作(Content-Type中没有空格)。原始问题与此相关:http://stackoverflow.com/questions/3098094/whitespace-escape-when-substituting-one-bash-variable-into-another-variable - kaspian

1
您可以尝试以下命令:bash -c your_bash_file.sh,我使用相同的问题进行了测试并成功运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接