我想以这样的方式打印变量的内容,打印输出可以直接粘贴到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)?
答案 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