Я могу заставить это работать с
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
, что также удовлетворитсредство проверки синтаксиса оболочки.