Bash 스크립트에서 키-값 쌍을 만드는 방법이 있습니까?


83

Bash 스크립트를 사용하여 키 값 쌍의 사전을 만들려고합니다. 이 논리를 사용하려고합니다.

declare -d dictionary
defaults write "$dictionary" key -string "$value"

... 어디에 $dictionary변수가 있지만 작동하지 않습니다.

Bash 스크립트에서 키-값 쌍을 만드는 방법이 있습니까?


나는 bash에서 일하고 있었다. 직접 할 방법을 찾았습니다.
RKS

이것의 사용도 도움이됩니다 : urls + = ( '<dict> <key> key1 </ key> <string>'$ value1 '</ string> <key> key2 </ key> <string>'$ value2 '</ string > <key> key3 </ key> <string> '$ value3'</ string> </ dict> '
RKS

3
큰! StackOverflow에 대한 자신의 질문에 답할 수 있고 심지어 권장되는 방식으로 비슷한 상황에있는 다른 사람들을 도울 수 있습니다.
Johnsyweb

샘플 사용 및 출력을 포함하면 답변을 찬성하겠습니다. 행운을 빕니다.
shellter

답변:


155

bash 버전 4에서 연관 배열이 도입되었습니다.

declare -A arr

arr["key1"]=val1

arr+=( ["key2"]=val2 ["key3"]=val3 )

이제 arr 배열에는 세 개의 키 값 쌍이 포함됩니다. Bash는 정렬이나 팝업 등으로 할 수있는 작업이 상당히 제한되어 있습니다.

for key in ${!arr[@]}; do
    echo ${key} ${arr[${key}]}
done

모든 키 값을 반복하고이를 에코합니다.

참고 : Bash 4는 GPLv3 라이센스로 인해 Mac OS X와 ​​함께 제공되지 않습니다. 다운로드하여 설치해야합니다. 자세한 내용은 여기 를 참조 하십시오.


25
Bash 4는 GPLv3 라이센스로 인해 Mac OS X와 ​​함께 제공되지 않습니다. 다운로드하여 설치해야합니다. (애플은 여전히 선박은 3.2 배쉬.)
PleaseStand

5
여기에 단점이 있습니다. 반복은 삽입 순서로 정렬되지 않습니다.
AlikElzin-kilaka

확실히 bash 버전 4가 필요합니다. 그렇지 않으면 선언 -A가 작동하지 않습니다. Mac은 bash 3.2와 함께 제공됩니다
Mamun

2
GPLv3 라이선스 때문이 아니라 Apple이 GPLv3 라이선스 소프트웨어를 사용하고 싶지 않기 때문입니다. 따라서 GPLv3 라이센스에는 문제가 없지만 Apple에는 문제가 있다고 생각합니다.
Tech Nomad

32

간단한 구분자를 사용할 수 있다면 매우 간단한 oneliner는 다음과 같습니다.

for i in a,b c_s,d ; do 
  KEY=${i%,*};
  VAL=${i#*,};
  echo $KEY" XX "$VAL;
done

이로써 및 i같은 문자 시퀀스로 채워집니다."a,b""c_s,d" . 각각 공백으로 구분됩니다. 다음에는 매개 변수 대체do사용 하여 쉼표 앞 의 부분과 그 뒤 의 부분을 추출 합니다.,


당신이 준 예를 설명해 주시겠습니까?
AlikElzin-kilaka

질문 : b변수에 공백이 포함되어 있으면 작동 합니까?
AlikElzin-kilaka

내 예에서 b는 변수가 아니며 for 루프의 목록이 공백으로 구분되어 있으므로 작동하지 않습니다.
math

2

영구 키 / 값 저장소의 경우 https://github.com/damphat/kv-bashkv-bash 에서 사용할 수있는 키 / 값 데이터베이스의 순수 bash 구현 인을 사용할 수 있습니다.

용법

git clone https://github.com/damphat/kv-bash
source kv-bash/kv-bash

영구 변수를 만들어보십시오.

kvset myName  xyz
kvset myEmail xyz@example.com

#read the varible
kvget myEmail

#you can also use in another script with $(kvget keyname)
echo $(kvget myEmail)

2

bash에서는

declare -A name_of_dictonary_variable

Bash는 그것이 사전이라는 것을 이해하도록합니다.

예를 들어 sounds사전 을 만들고 싶다면

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

어디에 dogwolf있는 "keys", 그리고 Bark하고 Howl있습니다 "values".

다음을 사용하여 모든 값에 액세스 할 수 있습니다. echo ${sounds[@]}또는echo ${sounds[*]}

다음을 사용해야 만 모든 키에 액세스 할 수 있습니다. echo ${!sounds[@]}

특정 키에 대한 값을 원하는 경우 다음을 사용할 수 있습니다.

${sounds[dog]}

그러면 Bark키 ( Dog)에 대한 값 ( ) 이 제공됩니다 .


0

sh지원하지 않는 이전 bash (또는 ) declare -A에서는 다음 스타일을 사용하여 키 / 값을 에뮬레이션 할 수 있습니다.

# key
env=staging


# values
image_dev=gcr.io/abc/dev
image_staging=gcr.io/abc/stage
image_production=gcr.io/abc/stable

img_var_name=image_$env

# active_image=${!var_name}
active_image=$(eval "echo \$$img_var_name")

echo $active_image
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.