$ 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
형식 문자열을 사용하면 됩니다.printf
bash
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")
또는 %q
printf 형식과 유사하게 연산자를 사용할 수 있습니다 @Q
.
$ echo ${astr[0]@Q}
'a'\''"b'
$ echo "declare -- astr[0]=${astr[0]@Q}"
declare -- astr[0]='a'\''"b'