Linux에서 Bash 사전이란 무엇이며 어떻게 사용합니까?

0
400

텍스트 줄이 있는 터미널을 보여주는 양식화된 노트북.
Fatmawati achmad zaenuri/Shutterstock.com

Bash 사전은 Linux 쉘 스크립트에서 해시 맵과 연관 배열을 제공합니다. 우리는 여러분 자신의 Linux 쉘 스크립트에서 이러한 강력하고 유용한 데이터 구조를 사용하는 방법을 보여줄 것입니다.

다른 이름의 장미

Bash 셸이란 무엇이며 Linux에 왜 중요한가요?

관련된Bash 셸이란 무엇이며 Linux에 왜 중요한가요?

사전의 정식 이름은 연관 배열입니다. 해시 테이블 및 해시 맵이라고도 합니다. 그것들은 일반 배열과 유사하게 기능하지만 중요한 차이점이 있는 데이터 구조입니다.

배열은 하나의 데이터 구조에 포함된 데이터 값의 모음입니다. 배열 요소라고 하는 데이터 값에 액세스하려면 배열에서 해당 위치를 알아야 합니다. 배열에서 배열 요소의 위치를 ​​인덱스라고 하므로 이러한 유형의 배열을 인덱스 배열이라고 합니다. 가장 일반적으로 사용되는 배열 유형입니다.

그러나 단점이 있습니다. 목록 내에서 배열 요소의 위치를 ​​모르는 경우 어떻게 배열 요소에 액세스합니까? 배열의 모든 요소를 ​​살펴보고 해당 위치의 값이 찾고 있는 값인지 테스트해야 합니다.

연관 배열은 이 문제를 해결합니다. 배열 요소를 고유하게 식별하기 위해 정수를 사용하지 않습니다. 그들은 키워드로 알려진 고유한 단어를 사용합니다. 배열 내 위치에 관계없이 키워드를 사용하여 배열 요소의 값을 검색할 수 있습니다. 인덱스 배열에서 배열 내의 위치를 ​​나타내는 정수는 오름차순입니다. 연관 배열의 키워드는 순서에 관계없이 사용할 수 있습니다.

키워드로 검색하여 연관 배열에서 값을 조회할 수 있습니다. 단어를 찾고 관련 값을 검색하는 것은 사전에서 단어를 찾고 그 의미를 찾는 것과 유사합니다. 이것이 연관 배열을 사전이라고 하는 이유입니다.

배쉬 4.0 이상

연관 배열은 Bash 셸 버전 4.0 이상에서 지원됩니다. 현재 Linux 배포판을 사용하고 있다면 문제가 없을 것입니다. Bash 버전을 확인하려면 다음 명령을 사용하십시오.

bash --version

광고

이 기사를 연구하는 데 사용된 시스템에는 Bash 5.1.4가 설치되어 있으므로 계속 진행할 수 있습니다.

기본 원리들

터미널 명령줄이나 스크립트에서 연관 배열을 만들려면 Bash 선언 명령을 사용합니다. NS -A (associative) 옵션은 Bash에 이것이 인덱스 배열이 아닌 연관 배열이 될 것임을 알려줍니다.

declare -A acronyms

이렇게 하면 “약어”라는 연관 배열이 생성됩니다.

일부 데이터를 배열에 넣으려면 키워드와 값을 제공해야 합니다. 다음 형식을 사용하여 이 작업을 수행할 수 있습니다.

array-name[key]=Value

몇 가지 배열 요소를 추가해 보겠습니다.

acronyms[ACK]=Acknowledgement
acronyms[BGP]="Border Gateway Protocol"
acronyms[CIDR]="Classless Inter-Domain Routing"
acronyms[DHCP]="Dynamic Host Configuration Protocol"
acronyms[EOF]="End of Frame"

이러한 명령은 5개의 배열 요소를 정의합니다. 값에 공백이 있는 경우 값은 따옴표로 묶입니다. 우리의 키워드는 알파벳 순서로 입력되었지만 원하는 순서대로 입력할 수 있습니다. 키워드는 고유해야 합니다. 동일한 키워드로 두 개의 항목을 만들려고 하면 입력한 두 번째 값이 첫 번째 값을 덮어씁니다. 해당 키워드가 포함된 항목은 여전히 ​​하나만 있으며 추가한 두 번째 값과 연결됩니다.

배열에서 값을 검색하려면 다음 형식의 명령을 사용합니다.

${array-name[key]}
광고

echo를 사용하여 터미널 창으로 출력을 보낼 수 있습니다.

echo ${acronyms[ACK]}
echo ${acronyms[DHCP]}

루프 사용

배열은 루프에서 매우 잘 사용됩니다. 연관 배열도 예외는 아닙니다. 루프는 반복적인 코드 섹션 없이 일련의 작업을 호출하는 효율적인 방법을 제공합니다. 루프를 살펴보기 전에 배열을 선언하는 효율적인 방법이 있습니다.

우리는 다음을 사용하여 배열을 만듭니다. declare 명령(동일 -A 옵션은 이전과 동일)하지만 키워드와 값을 명령줄에 목록으로 제공합니다.

declare -A countries=( [ALB]=Albania [BHR]=Bahrain [CMR]=Cameroon [DNK]=Denmark [EGY]=Egypt )

배열 이름은 “countries”이고 등호로 값 목록에 연결됩니다. =.” 값 목록은 “()” 그리고 각 키워드는 대괄호 “[]“. 값을 구분하는 쉼표가 없습니다. 공백이 포함된 값 문자열이 있는 경우 따옴표로 묶어야 합니다.

연관 배열이 값 대신 키워드를 반환하도록 하려면 느낌표 “!“를 배열 이름 앞에 붙입니다. at 기호 “@“는 모든 배열 요소를 의미하는 와일드카드로 사용할 수 있습니다.

이것 for 루프는 모든 키워드를 나열합니다.

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

키워드가 생성된 순서대로 나열될 필요는 없지만 중요하지 않습니다. 연관 배열은 순서가 지정된 인덱스에 의존하지 않습니다.

광고

매개변수 확장을 사용하여 모든 키워드를 나열할 수도 있습니다. 한 줄에 하나씩 나열되지 않고 한 줄에 나열됩니다.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

우리는 우리의 for 루프를 사용하여 키워드와 값을 동시에 인쇄합니다.

for key in "${!acronyms[@]}"; do echo "$key - ${acronyms[$key]}"; done

배열에 몇 개의 요소가 있는지 알고 싶다면 느낌표 대신 배열 이름 앞에 해시 “#”를 사용할 수 있습니다.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

배열 요소가 존재하는지 확인하기

키워드를 검색했지만 그러한 배열 요소가 없으면 반환 값은 빈 문자열이 됩니다. 때로는 배열 요소의 존재 여부에 대해 다른 표시기를 사용하는 것이 유용합니다.

“를 사용하여 배열 요소의 존재를 확인할 수 있습니다.+_” 운영자. 이것은 우리가 본 이전 연산자처럼 배열 이름 앞이 아니라 키워드 뒤에 옵니다.

if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi
if [ ${acronyms[FTP]+_} ]; then echo "Found"; else echo "Not found"; fi

키워드 “EOF”가 있는 배열 요소가 배열에서 발견되지만 키워드 “FTP”가 있는 배열 요소는 없습니다.

배열 요소 추가

연관 배열에 새 요소를 추가하는 것은 쉽습니다. 일부 프로그래밍 언어와 달리 배열을 선언할 때 배열의 크기를 정의할 필요가 없습니다. 미리 정의된 상한에 도달하지 않고 새 요소를 계속 추가할 수 있습니다.

광고

배열에 새 요소를 추가하려면 “+=” 운영자.

countries+=( [FJI]=Fiji )
echo "$(#countries[@]}"
echo ${countries[FJI]}

배열의 요소 수는 이제 6이고 새 키워드를 검색하면 배열 요소를 찾고 해당 값을 반환합니다.

배열 요소 및 배열 제거

NS unset 명령은 배열 요소를 제거하는 데 사용됩니다. 키워드에 공백이 있으면 따옴표로 묶습니다.

unset acronyms[EOF]
if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi

전체 어레이를 제거하려면 다음을 사용하십시오. unset 배열의 이름으로.

unset countries

배열에 변수 사용하기

연관 배열과 함께 변수를 사용하는 것은 간단합니다. 이 예에서는 변수 키를 “EOF” 문자열로 설정합니다. 배열에 새 배열 요소를 추가할 때 변수를 사용합니다. 사실, 우리는 이전에 삭제한 배열 요소를 교체하고 있습니다.

new 키워드로 호출하고 변수를 사용하여 새 배열 요소를 검색합니다. 키워드에 공백이 포함된 경우 변수 이름을 따옴표로 묶어야 합니다.

key=EOF
acronyms[$key]="End of Frame"
echo ${acronyms[EOF]}
echo ${acronyms[$key]}

창의력을 발휘하다

우리의 예는 사전처럼 각 배열 요소가 다른 모든 요소와 독립적인 정보 모음입니다. 각각은 고유한 정의입니다. 그러나 연관 배열은 다양한 컴퓨터 하드웨어 사양과 같이 한 가지와 관련된 다양한 정보를 쉽게 보유할 수 있습니다.

declare -A specification
specification[CPU]="Dual Core AMD Ryzen 5 3600"
specification[Speed]="3600 MHz"
specification[Kernel]="5.11.0-17-generic x86_64"
specification[Mem]="1978.5 MiB"
specification[Storage]="32 GiB"
specification[Shell]="Bash"
echo ${specification[CPU]}

언어로 효율적으로 작성한다는 것은 언어가 제공하는 메커니즘과 구조를 알고 해결하려는 문제에 가장 적합한 것을 선택하는 것을 의미합니다. 연관 배열은 사전처럼 이름으로 검색할 수 있는 데이터를 저장하는 사용하기 쉬운 방법을 제공합니다.