我试图从perl调用servicenow rest api来更新一些数据属性。
我正在使用curl命令来实现此目的,由于某些原因,我无法使用任何可用的perl模块。
我能够成功实现此目标,而json的value字段中没有任何特殊字符。
以下是用于格式化cmd的代码:
my $comments = "b'c";
my $cmd = `curl \"$url\" -i -s --insecure --user test:test --request PUT --header "Accept:application/json" --header "Content-Type:application/json" --data '{\"comments\":\"$comments\"}'`;
如果上面的值为“ bc”,我可以获取数据,但是如果我给出“ b'c”,则出现以下错误:
sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file
即使我尝试了以下代码:
my $cmd = system "curl https://test.service-now.com/api/now/table/incident/code?sysparm_display_value=true -i -s --insecure --request PUT --header \"Accept:application/json\" --header \"Content-Type:application/json\" --data '{\"comments\":\"bc\"}' --user test:test";
如果给出一个带有单引号b'c的字符串,则会出现相同的错误。
有人可以告诉我如何处理双引号字符串中的单引号吗?
答案 0 :(得分:1)
我可以使用它
my $comments = "b\"'\"c";
然后传递给外壳的字符串是
--data '{"comments":"b'"'"'c"}'
是串联在一起的三个单独的标记:
'{"comments":"b' resolves to {"comments":"b
"'" resolves to '
'c"}' resolves to c"}
另请参阅String::ShellQuote
,这是解决此类问题的天赐之物。
use String::ShellQuote;
$comments = "b'c";
@cmd = ("curl", $URL, "-i", "-s", "--insecure", "--request",
"PUT", "--header", "Accept:applicatin/json", "--header",
"Content-Type:application/json",
"--data", qq[{"comments":$comments}], "--user", "test:test");
$cmd = shell_quote(@cmd);
print $cmd;
给你:
curl 'https://test.service-now.com/api/now/table/incident/code?sysparm_display_value=true'
-i -s --insecure --request PUT --header
Accept:application/json --header Content-Type:application/json
--data '{"comments":"b'\''c"}' --user test:test
这也将满足shell的语法检查器的要求。