Bash 쉘에서 동등한 데이터 구조를 설정합니까?

Bash 쉘에서 동등한 데이터 구조를 설정합니까?

데이터 구조가 다음과 유사한 bash 스크립트가 있습니까?java.util.Set사용될 것인가? 기본적으로 중복된 요소를 추가하더라도 두 개의 동일한 요소를 추가할 수 없는 컬렉션이 있습니까?

나는 복잡한 것을 저장하고 싶지 않고 문자열 세트만 저장하고 싶습니다.

또한 존재하는 경우 특정 버전의 bash가 필요합니까, 아니면 단지 POSIX 호환입니까?

나는 bash에 배열이 있고 일부 bash 버전에는 해시맵이 있다는 것을 알고 있습니다(전부는 아님).

답변1

문자열 세트에만 관심이 있다면 다음을 사용할 수 있습니다.연관 배열("해시맵"):

declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello]}" ] ; then ... ; fi

당신이 관심을 갖는 것은 키와 관련된 것이 있는지 여부뿐입니다. 값은 중요하지 않습니다. 단지 거기에 비어 있지 않은 문자열이 있다는 것만 주의하면 됩니다. 따라서 항목을 빈 문자열로 설정하여 "제거"할 수 있습니다.

HashMap<String,Object>이는 집합을 나타내기 위해 a를 사용하는 것과 비슷합니다 (실제로는Java의 HashSet은 무엇을 합니까?, 실제로).

이러한 연관 배열은 Bash 4 이상과 zsh 및 ksh에서 사용할 수 있습니다. macOS용 Bash 3.2를 포함하여 시리즈 3 Bash 버전 이하에는 적용되지 않습니다.


POSIX에 해당하는 것은 없습니다. 효과를 시뮬레이션할 수 있습니다.사용eval문자열이 적절하게 제한되어 있거나 유효한 변수 이름으로 자연스럽게 변환되는 경우:

hm_hello=1
hm_world=1
key=test
eval "hm_$key=1"
if [ "$(eval hm_$key)" ] ; then ... ; fi

임시 파일을 사용할 수도 있습니다grep예를 들어 많은 수의 임시 파일과 파일 시스템도 키로 저장됩니다.


쉘 스크립트보다 다른 도구나 언어가 더 적합할 수도 있습니다. 최저 한도에서,awk모든 POSIX 시스템에 적용됩니다.문자열 키 연관 배열을 지원합니다.

복잡한 데이터 구조가 필요한 경우 기존 범용 언어가 더 적합할 수 있습니다. Perl과 Python도 널리 사용됩니다.

답변2

다음의 문자열 세트와 같은 것 bash:

  1. 처리할 줄 바꿈 세트로 구분된 문자열입니다 sort -u.

  2. 연관 배열의 키 세트(버전 4.0부터).

bash실제로 Java는 Java만큼 다재다능한 프로그래밍 언어가 아니므로 이를 사용하여 일반적인 프로그래밍을 수행하려면 꽤 많은 어려움을 겪어야 합니다. 특히 기본 배열보다 더 이국적인 데이터 구조가 필요한 경우에는 더욱 그렇습니다.

의 배열 및 연관 배열은 bashPOSIX 셸 표준의 확장입니다. POSIX 셸에는 하나의 배열( $@)만 있고 연관 배열은 없습니다.

관련 정보