지니의 따듯한 공간

배열 [Array] 본문

Network/Linux

배열 [Array]

Jineer 2019. 6. 19. 14:46

 

대부분의 프로그래밍 언어에서 제공하는 배열에 대해 알아보자.

배열이란 연속적으로 할당된 기억공간으로 여러 데이터를 저장하기위해 사용된다. 

쉘에 서 배열을 생성하는 방법은 다음과 같다. 

 

배열을 생성하는 법

 

배열에 값을 할당하는 방법은 두가지가 있다. 

 

첫번째는 배열의 각 원소에 다음과 같이 값을 할당한다.

각 인덱스에 값을 할당

두 번째 방법은 아래와 같이 배열 이름에 여러개의 값을 할당하는 것

여러 인덱스에 값을 할당

배열 원소의 값을 출력하려면 아래와 같이 중괄호({})를 이용한 변수 확장을 하면된다.

배열 인덱스의 값 출력

원소를 확인 할 때에는 중괄호 확장을 반드시 해 주어야 한다. 

배열을 생성 및 값 할당, 출력 하는 예이다.

보통은 우리가 알다시피 days= ( 인자, 인자, 인자) 이런식으로 하는게 보편적이다.

C언어 에서와는 다르게 {}로 배열의 값을 넣는 것이 아니라, () 로 값을 넣는 점을 주의 하자

 

배열에 여러개 값을 할당 시 인덱스를 함께 사용하는 예이다. .

쉘 만이 가지고있는 특징.

쉘에서는 배열의 특정 인덱스에만 값을 할당하는 것이 가능하다.

-> 인덱스 값을 함께 사용하면 인덱스로 나열된 원소만 값을 할당받고,

나머지 원소는 널(null) 값을 가진다.

 

배열 연산에는 배열의 모든 원소 출력, 원소 수 확인, 첨자 검색, 원소 추가, 배열 삭제
등이 있다. 배열의 각 연산을 예와 함께 알아보자.

 

다음은 배열의 모든 원소를 출력하는 변수 확장의 예이다.

다음은 배열의 모든 원소를 출력하는 변수 확장의 예이다.

"@" : "유지하면서 단어 별로 토큰링

"$" : 모든것이 하나의 문자열로 출력

$, @ : 전부 다 모아서, 공백 단위로 토큰링해서 출력

 

당연히 "@"이 가장 실용적이겠죠? ㅎ.ㅎ

 

 

위 예에서 ${animals[*]}는 배열의 모든 원소 값을 토큰 단위로 분할 하여 6개의 단어 목록으로 확장된다.

${animals[*]}는 배열의 모든 원소 값을 토큰 단위로 분할 하여 6개의 단어 목록으로 확장된다.

 

 

${animals[@]}는 ${animals[*]}와 동일하게 배열의 모든 원소 값을 토큰 단  위로 분할 하여 6개의 단어 목록으로 확장된다.

${animals[@]}는 ${animals[*]}와 동일하게 배열의 모든 원소 값을 토큰 단
위로 분할 하여 6개의 단어 목록으로 확장된다.

 

 “${animals[*]}”는 배열의 모든 원소 값을 하나의 문자열로 통합하여 1개의 단어 목록으로 확장된다.

“${animals[*]}”는 배열의 모든 원소 값을 하나의 문자열로 통합하여 1개의 단어 목록으로 확장된다.

 

“${animals[@]}”는 배열의 모든 원소 값을 각각의 문자열로 단위로 확장하여 3개의 단어 목록으로 확장된다. 

“${animals[@]}”는 배열의 모든 원소 값을 각각의 문자열로 단위로 확장하여 3개의 단어 목록으로 확장된다. 

 

 

따라서, 쌍따옴표를 포함하는 문자열 배열의 경우 

배열의 모든 원소로 확장하고자 할 때에는 “${animals[@]}”를 사용하는 것이 일반적이다.

 

배열의 모든 원소 수를 출력하고자 하면

 ${#array_name[*]}나 ${#array_name[@]}를 사용하면된다. 

이와 달리 ${#array_name[i]}는 i번째 원소(array_name[i]) 값의 길이(문 자열의 길이)로 확장된다. 

 

앞 장에서 나왔듯이 #은 인덱스의 갯수를 나타낸다.

*나 @이면 전체 인덱스의 갯수를 출력하고,

[i] , 임의의 숫자를 적으면 그 인덱스에 해당하는 값의 길이를 나타낸다.

 

배열에서 값이 할당된 모든 원소 수를 출력하는 예

 

위에는 *랑 @라서 총 원소의 길이

3개라서 3 == 3 

 5 5 6 은 해당하는 인덱스의 값의 길이라서 5, 5, 6

 

 

 

또하나의 쉘 배열의 특징!

값을 가지고 있는 원소(= 첨자)들의 인덱스 값을 출력 할수있다.

!를 쓰면 값이 있는 인덱스를 출력

배열에서 값이 할당된 모든 원소의 첨자로 확장하고자 할 땐 

${!array_name[*]}나 ${!array_name[@]}를 사용한다. 

다음은 배열의 모든 원소의 첨자를 출력하는 예이다.

 

 

기존 배열의 끝에 원소를 추가하고자 할 때에는 배열의 이름에 += 연산자를 이용하여 원소 값을 추가한다. 

배열에 원소를 추가하는 예이다.

 

 

배열 전체나 배열의 특정 원소를 삭제하고 할 때에는 unset 명령어를 이용한다.

배열과 배열의 원소를 삭제하는 예

 

배열을 그냥 삭제할때는 

해당하는 인덱스만 삭제 할때는 ' ' 인용을 반드시 해 주어야 한다.

 

 

 

추가 실습

 1. 정수목록을 명령라인 인자로 전달받아 최대값과 최소값을 출력

예) intlist 20 90 30 70 40 60 10 50
    최소값 = 10
    최대값 = 90


2. 1000이하의 모든 소스를 출력
   조건) isPrime()함수 작성 : 명령라인 전달값이 소수이면 0 반환, 아니면 1 반환
          예) isPrime2 ==> return 0, isPrime9 ==> return 1

결과
2 3 5 7 11 13 17  .... (1줄에 10개씩 출력)

소수: 1과 자신 이외의 숫자로 나누어 떨어지지 않는 숫자

소수 출력하기

 

실행결과

 

'Network > Linux' 카테고리의 다른 글

위치매개변수  (0) 2019.06.19
반복문  (0) 2019.06.14
키보드 입력과 다중 선택  (0) 2019.06.12
ACL [ Access Control List ]  (0) 2019.05.31
정규 표현식  (0) 2019.05.29
Comments