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")

또는 %qprintf 형식과 유사하게 연산자를 사용할 수 있습니다 @Q.

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

관련 정보