引用打印shell变量

时间:2018-04-23 11:12:54

标签: bash shell variables printing escaping

我想以这样的方式打印变量的内容,打印输出可以直接粘贴到shell中以获取变量的原始内容。

如果内容不包含任何特殊字符,则这是微不足道的,特别是没有引号。 e.g。

$ x=foo
$ echo x=${x}
x=foo

在上面的示例中,我可以获取输出(x=foo并将其粘贴到新终端以将foo分配给x)。

如果变量内容包含空格,事情会变得有点棘手,但它仍然很容易:

$ x="foo bar"
$ echo x=\"${x}\"
x="foo bar"

如果允许变量包含任何字符,例如:

,则启动麻烦
$ x=foo\"bar\'baz
$echo ${x}
foo"bar'baz
$ echo x=\"${x}\"
x="foo"bar'baz"
$ x="foo"bar'baz"
>

(终端挂起,等我关闭不平衡的"

我所期望的是如下输出:

x=foo\"bar\'baz

我该怎么做,最好是POSIX兼容(但是如果它没有帮助,只有bash)?

2 个答案:

答案 0 :(得分:4)

使用declare -p

x=foo\"bar\'baz
declare -p x

declare -- x="foo\"bar'baz"

即使有数组:

arr=(a 'foo' 'foo bar' 123)
declare -p arr

declare -a arr='([0]="a" [1]="foo" [2]="foo bar" [3]="123")'

-p选项将显示每个变量名称的属性和值,可用于再次直接设置变量。

根据评论,在没有declare -p帮助的情况下在POSIX中执行此操作将是:

set | grep '^x='

答案 1 :(得分:3)

您可以使用printf命令及其支持的%q flag来打印关联的参数shell-quoted

x=foo\"bar\'baz

printf 'x=%q' "$x"
x=foo\"bar\'baz

尽管%q 是一个POSIX扩展,但已添加到bash shell的最新版本中。如果您正在寻找这个,请查看POSIX sh equivalent for Bash's printf %q