$ 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
的格式字符串将为您做到这一点:printf
bash
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")
或者类似于%q
printf 格式,您可以使用@Q
运算符:
$ echo ${astr[0]@Q}
'a'\''"b'
$ echo "declare -- astr[0]=${astr[0]@Q}"
declare -- astr[0]='a'\''"b'