bash - 使用curl和来自文件

时间:2016-07-20 08:09:16

标签: json bash curl theforeman

我有一个像这样的bash脚本

#!/bin/bash

while read fqdn hostname; do
curl -H "Content-Type:application/json" -XPUT "https://server/api/hosts/${fqdn}" -d '{"host":{"name": "'${hostname}'"}}' --cacert bundle.pem --cert pnet-pem.cer --key privkey.pem
done <curl1.txt

curl1.txt文件包含

fqdn(tab)hostname

..........

我必须使用theForeman API更新一些数据。我有很多fqdns和主机名,所以我写了上面的脚本。问题出在JSON上,因为我收到这样的错误:

{"status":400,"error":"There was a problem in the JSON you submitted: 795: unexpected token at '{\"host\":{\"name\": \"ptesrv02-lub\r\"}}'"}

当我将'{"host":{"name": "${hostname}"}}'改为'{"host":{"name": "'${hostname}'"}}'时,我得到了

{
  "error": {"id":130,"errors":{"interfaces.name":["is invalid"],"name":["is invalid"]},"full_messages":["Name is invalid","Name is invalid"]}
}

问题出在哪里?你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

要从Windows复制的文件中删除琐碎的特殊字符(CR-LF结尾)'tr'命令可以用作

hostname=$(echo $hostname|tr -d '\r')

在上面的示例中。这些特殊字符的出现破坏了bash对待字符的方式。

threadp的信用,指出hostname变量中存在特殊字符。

如果您怀疑该文件有CR-LF个结尾,您可以通过使用grep进行搜索来确认,将文件视为二进制文件

grep -U $'\015' curl1.txt

答案 1 :(得分:1)

threadp所示,您有一个尾随\r字符。您可以尝试将其删除。

${hostname%?}

此用法只删除最后一个字符,在这种情况下,它是尾随\r。 但是,最好使用

${hostname/$'\r'/}

感谢123