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"

何かを使用できますが、bashがまだ推測できない方法でastr [n]へのアクセスをsed許可しているかどうか疑問に思います。declare -p

答え1

エスケープされた特殊文字を使用してデータを表示する方法を探している場合は、%qフォーマット文字列を使用できます。printfbash

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

declare -p提案された-like出力を複製するには、次のようにします。

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

これは、bash次の%qフォーマット文字列に関連するマニュアルの内容ですprintf

%q

printf対応するパラメータは、シェル入力として再利用できる形式で出力されます。

答え2

Bash v4.4では、@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")

あるいは、printf形式と%q同様に演算子を使用できます@Q

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

関連情報