배열은 동일한 유형 또는 다른 유형의 여러 값을 포함하는 변수입니다. 배열의 크기에 대한 최대 제한은 없으며 멤버 변수를 연속적으로 인덱싱하거나 할당해야 한다는 요구 사항도 없습니다. 배열 인덱스는 0으로 시작합니다.
이 기사에서는 bash의 15가지 다양한 배열 작업을 검토해 보겠습니다.
이 기사는 진행 중인 Bash Tutorial 시리즈의 일부입니다. bash 스크립팅을 처음 접하는 분들은 Bash 스크립팅 소개 튜토리얼에서 시작하십시오.
1. 배열 선언 및 값 할당
bash에서는 변수가 다음과 같은 형식으로 사용될 때 배열이 자동으로 생성됩니다.
name[index]=value
- name은 배열의 이름입니다.
- index는 0보다 크거나 같은 숫자로 평가되어야 하는 임의의 숫자 또는 표현식일 수 있습니다. 선언 -a arrayname을 사용하여 명시적 배열을 선언할 수 있습니다.
$ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat
배열에서 요소에 액세스하려면 ${name[index]}와 같은 중괄호를 사용하세요.
2. 선언 중 배열 초기화
배열의 각 요소를 개별적으로 초기화하는 대신 중괄호로 요소 목록(공백으로 구분)을 지정하여 배열을 선언하고 초기화할 수 있습니다.
Syntax: declare -a arrayname=(element1 element2 element3)
요소에 공백 문자가 있는 경우 따옴표로 묶습니다.
#! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');
선언 -a 배열을 선언하고 괄호 안의 모든 요소는 배열의 요소입니다.
<센터> 센터>3. 전체 Bash 배열 인쇄
배열의 전체 요소를 인쇄하는 방법에는 여러 가지가 있습니다. 인덱스 번호가 @ 또는 *이면 배열의 모든 구성원이 참조됩니다. bash에서 반복문을 사용하여 배열 요소를 탐색하고 인쇄할 수 있습니다.
echo ${Unix[@]} # Add the above echo statement into the arraymanip.sh #./t.sh Debian Red hat Ubuntu Suse
인덱스 번호를 제공하지 않고 배열의 멤버 변수 내용을 참조하는 것은 인덱스 번호 0으로 참조되는 첫 번째 요소의 내용을 참조하는 것과 같습니다.
4. Bash 배열의 길이
$#이라는 특수 매개변수를 사용하여 배열의 길이를 얻을 수 있습니다.
${#arrayname[@]}은 배열의 길이를 제공합니다.
$ cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora'); echo ${#Unix[@]} #Number of elements in the array echo ${#Unix} #Number of characters in the first element of the array.i.e Debian $./arraymanip.sh 4 6
5. 배열의 n번째 요소 길이
${#arrayname[n]}은 배열에서 n번째 요소의 길이를 제공해야 합니다.
$cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${#Unix[3]} # length of the element located at index 3 i.e Suse $./arraymanip.sh 4
6. 배열의 오프셋 및 길이로 추출
다음 예제는 Unix라는 배열에서 위치 3부터 2개의 요소를 추출하는 방법을 보여줍니다.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]:3:2} $./arraymanip.sh Suse Fedora
위의 예는 세 번째 인덱스와 네 번째 인덱스의 요소를 반환합니다. 인덱스는 항상 0으로 시작합니다.
7. 배열의 특정 요소에 대한 오프셋 및 길이 추출
배열 요소에서 처음 4개 요소만 추출하려면 . 예를 들어 배열의 두 번째 인덱스에 위치한 Ubuntu의 경우 배열의 특정 요소에 대해 오프셋과 길이를 사용할 수 있습니다.
$cat arraymanip.sh #! /bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[2]:0:4} ./arraymanip.sh Ubun
위의 예는 배열의 두 번째 인덱싱된 요소에서 처음 4개 문자를 추출합니다.
8. 배열 요소에서 검색 및 바꾸기
다음 예는 배열 요소에서 Ubuntu를 검색하고 'SCO Unix'라는 단어로 대체합니다.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]/Ubuntu/SCO Unix} $./arraymanip.sh Debian Red hat SCO Unix Suse Fedora UTS OpenLinux
이 예에서는 두 번째 인덱스 'Ubuntu'의 요소를 'SCO Unix'로 바꿉니다. 그러나 이 예는 배열 내용을 영구적으로 대체하지 않습니다.
9. 기존 Bash 배열에 요소 추가
다음 예는 기존 배열에 요소를 추가하는 방법을 보여줍니다.
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Unix=("${Unix[@]}" "AIX" "HP-UX") echo ${Unix[7]} $./arraymanip.sh AIX
Unix라는 어레이에서 7번째와 8번째 인덱스에 각각 'AIX'와 'HP-UX' 요소가 추가되었습니다.
10. 배열에서 요소 제거
unset은 배열에서 요소를 제거하는 데 사용됩니다. unset은 요소에 null을 할당하는 것과 같은 효과를 가집니다.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); unset Unix[3] echo ${Unix[3]}
위의 스크립트는 세 번째 인덱스에서 사용할 수 있는 값인 null만 인쇄합니다. 다음 예는 배열에서 요소를 완전히 제거하는 방법 중 하나를 보여줍니다.
$ cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); pos=3 Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))}) echo ${Unix[@]} $./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
이 예에서 ${Unix[@]:0:$pos}는 0번째 인덱스부터 시작하여 3개의 요소, 즉 0,1,2를 제공하고 ${Unix[@]:4}는 4번째 인덱스에서 마지막 인덱스. 그리고 위의 두 출력을 병합합니다. 이것은 배열에서 요소를 제거하는 해결 방법 중 하나입니다.
11. 패턴을 사용하여 Bash 배열 요소 제거
검색 조건에서는 아래와 같이 패턴을 부여하고 나머지 요소를 다른 배열에 저장할 수 있습니다.
$ cat arraymanip.sh #!/bin/bash declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora'); declare -a patter=( ${Unix[@]/Red*/} ) echo ${patter[@]} $ ./arraymanip.sh Debian Ubuntu Suse Fedora
위의 예는 Red* 패턴이 있는 요소를 제거합니다.
12. 배열 복사
배열 요소를 확장하고 아래와 같이 새 배열에 저장합니다.
#!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Linux=("${Unix[@]}") echo ${Linux[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
13. 두 개의 Bash 배열 연결
두 배열의 요소를 확장하고 새 배열에 할당합니다.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") echo ${UnixShell[@]} echo ${#UnixShell[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh 14
'Unix' 배열과 'Shell' 배열의 요소를 모두 가지고 있는 배열을 출력하며, 새로운 배열의 요소 개수는 14개입니다.
14. 전체 배열 삭제
unset은 전체 배열을 삭제하는 데 사용됩니다.
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") unset UnixShell echo ${#UnixShell[@]} $ ./arraymanip.sh 0
배열의 설정을 해제하면 위와 같이 길이가 0이 됩니다.
15. 파일의 내용을 배열로 로드
파일의 내용을 한 줄씩 배열에 로드할 수 있습니다.
#Example file $ cat logfile Welcome to thegeekstuff Linux Unix $ cat loadcontent.sh #!/bin/bash filecontent=( `cat "logfile" `) for t in "${filecontent[@]}" do echo $t done echo "Read file content!" $ ./loadcontent.sh Welcome to thegeekstuff Linux Unix Read file content!
위의 예에서 배열 요소의 각 인덱스는 for 루프를 통해 인쇄되었습니다.
권장 도서
Bash 101 해킹, Ramesh Natarajan 작성 . 저는 대부분의 시간을 Linux 환경에서 보냅니다. 그래서 당연히 저는 Bash 명령줄과 셸 스크립팅의 열렬한 팬입니다. 15년 전, *nix의 다양한 버전을 작업할 때 C 셸과 Korn 셸에서 많은 코드를 작성했습니다. 나중에 시스템 관리자로 Linux 작업을 시작했을 때 Bash 셸 스크립팅을 사용하여 가능한 모든 작업을 거의 자동화했습니다. 내 Bash 경험을 바탕으로 Bash 명령줄과 셸 스크립팅 모두에 대한 101개의 실용적인 예제가 포함된 Bash 101 Hacks eBook을 작성했습니다. Bash를 마스터할 생각을 했다면 Bash 명령줄과 셸 스크립팅을 제어하는 데 도움이 될 이 책을 읽어보세요.