나는 당신이 두 가지 다른 것을 요구하고 있다고 생각합니다.
bash가 루프 없이이 정보를 인쇄하게하는 방법이 있습니까?
예, 그러나 루프를 사용하는 것만 큼 좋지 않습니다.
출력의 키 = 값 부분 만 가져 오거나 인쇄하는 더 확실한 방법이 있습니까?
예, for
루프입니다. 외부 프로그램이 필요없고 간단하며 장점없이 정확한 출력 형식을 쉽게 제어 할 수 있다는 장점이 있습니다.
declare -p
( typeset -p
) 의 출력을 처리하려는 모든 솔루션은 a) 괄호 또는 괄호를 포함하는 변수 자체의 가능성, b) declare -p
셸에 대한 출력을 유효하게 입력하기 위해 추가 해야하는 따옴표 를 처리해야합니다.
예를 들어, b="${a##*(}"
키 / 값에 여는 괄호가 포함되어 있으면 확장에서 일부 값을 사용합니다. 가장 긴 접두사 ##
를 제거하는 을 사용했기 때문 입니다. 동일합니다 . 물론 더 정확하게 인쇄 된 상용구를 일치시킬 수는 있지만 인용 부호를 모두 원하지 않으면 여전히 어려움을 겪을 것입니다.c="${b%% )*}"
declare
당신이 그것을 필요로하지 않으면 아주 좋아 보이지 않습니다.
$ declare -A array=([abc]="'foobar'" [def]='"foo bar"')
$ declare -p array
declare -A array='([def]="\"foo bar\"" [abc]="'\''foobar'\''" )'
for
루프를 사용하면 원하는대로 출력 형식을 쉽게 선택할 수 있습니다.
# without quoting
$ for x in "${!array[@]}"; do printf "[%s]=%s\n" "$x" "${array[$x]}" ; done
[def]="foo bar"
[abc]='foobar'
# with quoting
$ for x in "${!array[@]}"; do printf "[%q]=%q\n" "$x" "${array[$x]}" ; done
[def]=\"foo\ bar\"
[abc]=\'foobar\'
거기 에서 출력 형식을 변경하는 것도 간단 합니다 (키 주위의 괄호를 제거하고 모든 키 / 값 쌍을 한 줄에 넣으십시오 ...). 쉘 자체가 아닌 다른 것을 인용 해야하는 경우 여전히 직접 작성해야하지만 최소한 원시 데이터가 있어야합니다. 키나 값에 줄 바꿈이 있으면 인용 부호가 필요할 수 있습니다.
현재 Bash (4.4, 생각합니다)를 사용하면 printf "[%s]=%s" "${x@Q}" "${array[$x]@Q}"
대신 사용할 수도 있습니다 printf "%q=%q"
. 다소 좋은 인용 형식을 생성하지만 물론 작성해야 할 작업이 조금 더 있습니다. (그리고 그것은 대소 문자를 인용하지 않는 @
배열 키로 %q
인용합니다.)
for 루프가 쓰기에 너무 지친 것처럼 보이면 어딘가에 함수를 저장하십시오 (여기 인용하지 않고)
printarr() { declare -n __p="$1"; for k in "${!__p[@]}"; do printf "%s=%s\n" "$k" "${__p[$k]}" ; done ; }
그런 다음 사용하십시오.
$ declare -A a=([a]=123 [b]="foo bar" [c]="(blah)")
$ printarr a
a=123
b=foo bar
c=(blah)
인덱스 배열에서도 작동합니다.
$ b=(abba acdc)
$ printarr b
0=abba
1=acdc
printf ...%q...
배열에@
% q가 따옴표로 표시되지 않고 키a=([@]=value)
의 구문 오류 인 경우 배열 의 출력은 쉘에 다시 입력하기에 적합 하지 않습니다bash
.