正确转义JSON以与bash一起使用

时间:2018-12-15 06:48:06

标签: json bash shell

我有这个node.js脚本:

const cp = require('child_process');
const json = JSON.stringify(['foo','bar']);

const k = cp.spawn('bash');

const cmd = `
  export foo=${json}
`;

k.stdin.end(`
    ${cmd}
    echo "foo is: $foo"; exit 0;
`);


k.stdout.pipe(process.stdout);
k.stderr.pipe(process.stderr);

我将输出输出到stdout:

foo is: '[foo,bar]'

并且正尝试获取它:

foo is: ["foo","bar"]

似乎正在发生这种现象,但我不知道为什么:

Why JSON strings transform with bash shell

有人知道我的脚本中发生了什么以及如何使JSON字符串在通过bash传输时保持JSON吗?

2 个答案:

答案 0 :(得分:2)

如果您希望bash保持字符串不变,则需要使用single quotes

  

用单引号('')引起来的字符会保留文字   引号内每个字符的值。单引号可能不会   即使在单引号前加反斜杠,也会出现这种情况。

此代码生成所需的输出:

const cp = require('child_process');
const json = JSON.stringify(['foo','bar']);

const k = cp.spawn('bash');

// NOTE single quotes around '${json}':
const cmd = `
  export foo='${json}' 
`;

k.stdin.end(`
    ${cmd}
    echo "foo is: $foo"; exit 0;
`);


k.stdout.pipe(process.stdout);
k.stderr.pipe(process.stderr);

答案 1 :(得分:2)

在JSON周围加上单引号。

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single, IncludeExceptionDetailInFaults:=True, AddressFilterMode:=AddressFilterMode.Any)>
Public Class mySvc
...

但是,如果JSON中有任何单引号,则它们必须位于界定JSON的引号之外,而应位于一组双引号之内。因此,您首先应该这样做:

const cmd = `
  export foo='${json}'
`;