bash 可以使用 `declare -p` 显示一个数组项 id 和值吗?

bash 可以使用 `declare -p` 显示一个数组项 id 和值吗?
$ str="a'\"b"
$ declare -p str
declare -- str="a'\"b" # see " was escaped, possibly other chars will too
$ astr=("$str" "c")
$ declare -p astr
declare -ax astr='([0]="a'\''\"b" [1]="c")'

那么,有什么方法可以做类似的事情declare -p astr[0]并检索这样的东西:declare -- astr[0]="a'\"b"

我可以使用sed或其他东西,但我想知道 bash 是否允许以declare -p某种我还无法猜测的方式访问 astr[n] ?

答案1

如果您只是寻找一种显示带有转义特殊字符的数据的方法,那么in%q的格式字符串将为您做到这一点:printfbash

printf '%q\n' "${astr[0]}"

要复制declare -p您建议的 -like 输出:

printf 'declare -- astr[0]="%q"\n' "${astr[0]}"

这是来自bash手册,关于以下%q格式字符串printf

%q

导致printf以可重复用作 shell 输入的格式输出相应的参数。

答案2

在 bash v4.4 中,您可以使用@A参数扩展运算符来获得类似的结果,但对于单个数组元素来说效果不佳:

A

扩展是赋值语句或声明命令形式的字符串,如果对其求值,将重新创建参数及其属性和值。

$ str="a'\"b"
$ astr=("$str" "c")
$ echo ${astr[0]@A}
declare -a astr='a'\''"b'
$ echo ${astr[@]@A}
declare -a astr=([0]="a'\"b" [1]="c")

或者类似于%qprintf 格式,您可以使用@Q运算符:

$ echo ${astr[0]@Q}
'a'\''"b'
$ echo "declare -- astr[0]=${astr[0]@Q}"
declare -- astr[0]='a'\''"b'

相关内容