2016-06-14 4 views
6

Bash에서는 해시 맵의 항목을 설정 해제하려고합니다. 그러나 나는 실패했다. 코드는 다음과 같습니다.인용 부호를 키로 사용하는 Bash 해시맵

declare -A arr 
arr["a'b"]=3 
echo ${!arr[@]} ## output: a'b 
key="a'b" 
unset arr[$key] ## error: -bash: unset: `arr[a'b]': not a valid identifier 

이 항목을 어떻게 해제 할 수 있습니까?

+0

['unset arr [ "$ key"]'] (http://mywiki.wooledge.org/BashGuide/Practices#Quoting)? ** 편집 ** : 이것도 작동하지 않습니다 ... – anishsane

+1

bash에서 버그처럼 보입니다 – Leon

+0

음 ... 내 나쁜 ... 또한, 'arr ['$ x '] = 123; unset arr [ '$ x']''-bash : unset : [$ x] : 잘못된 배열의 첨자' – anishsane

답변

5

그냥 작은 따옴표를 사용!

+0

화려한 방법! – ruanhao

+1

그것은 마법입니다. 'unset'이 2 차 확장을 수행한다는 것이 문서화되어 있습니까? –

+0

@ 글렌 잭맨 : 나는 그것이 실제로 기록 된 것을 보지 못했지만 실제로는 '설정 해제'하지 않았습니다. 산술 문맥은 또한이 행동을 보여준다 :'declare -A glenn; key = '$ (ls> &2)'; (glenn [$ key]))'놀랍게도, 대답은 아마도 소스에 있습니다 :). Bash는 정말 미친 분석 방법을 가지고 있습니다. –

4

까다 롭습니다. 당신은 "내부"따옴표 이스케이프 손으로 작업을 수행 할 수 있습니다

$ declare -A arr=(["a'b"]=3 [foo]=bar) 
$ key="a'b" 
$ unset "arr[$key]" 
bash: unset: `arr[a'b]': not a valid identifier 
$ unset "arr[a\'b]" 
$ declare -p arr 
declare -A arr='([foo]="bar")' 

을하지만 어떻게 "프로그래밍"그것을 할? 다행히 배쉬는 문자열을 '탈출'하는 메커니즘을 가지고있다 : printf "%q" :

$ declare -A arr=(["a'b"]=3 [foo]=bar) 
$ declare -p arr 
declare -A arr='(["a'\''b"]="3" [foo]="bar")' 
$ key="a'b" 
$ unset 'arr[$key]' 
$ declare -p arr 
declare -A arr='([foo]="bar")' 

가 완료 :

$ declare -A arr=(["a'b"]=3 [foo]=bar) 
$ echo "$key" 
a'b 
$ printf "%q" "$key" 
a\'b 
$ unset "arr[$(printf "%q" "$key")]" 
$ declare -p arr 
declare -A arr='([foo]="bar")' 
관련 문제