Shell 프로 그래 밍 입문 부터 정통 까지 - 배열

21604 단어 #셸 프로 그래 밍
Shell 프로 그래 밍 에서 도 배열 작업 을 지원 합 니 다. Shell 스 크 립 트 에서 배열 을 추가 삭제 하고 수정 할 수 있 습 니 다.
1. 정의 배열
1. 지정 한 요소 값 을 통 해 배열 을 정의 합 니 다.
셸 에서 사용 자 는 다른 프로 그래 밍 언어 처럼 요소 값 을 통 해 배열 을 정의 할 수 있 습 니 다. 문법 은 다음 과 같 습 니 다. array[key]=value array 는 배열 의 이름 을 표시 하고 key 매개 변 수 는 배열 요소 의 색인 을 표시 합 니 다. 보통 정수 이 고 value 는 요소 의 값 입 니 다. 주의해 야 할 것 은 배열 의 아래 표 시 는 0 에서 시작 합 니 다.
#! /usr/bin/env bash

#指定数组元素值
array[1]=hello
array[3]=world

echo "${array[1]} ${array[3]}"

Output:
$ sh test.sh
hello world

2. declare 문 구 를 통 해 배열 을 정의 합 니 다.
declare 를 사용 하여 배열 을 정의 하 는 문법 은 다음 과 같 습 니 다. declare -a array
#! /usr/bin/env bash

#通过declare定义数组
declare -a MyArray
MyArray[0]=hello
MyArray[1]=world

echo "${MyArray[0]} ${MyArray[1]}"

Output:
$ sh test.sh
hello world

또한 셸 은 관련 배열 을 정의 할 수 있 습 니 다. declare -A ARRAY_NAME 관련 배열 을 정의 하면 색인 을 사용자 정의 할 수 있 고 문자, 문자열 등 으로 사용 할 수 있 습 니 다.
#! /usr/bin/env bash

#通过declare定义关联数组
declare -A MyArray
MyArray[sex]=man
MyArray[name]=random_w
MyArray[age]=18

echo "My name is ${MyArray[name]}, I am ${MyArray[age]} years old, and I am a ${MyArray[sex]}"

Output:
$ sh test.sh
My name is random_w, I am 18 years old, and I am a man

3. 원소 값 집합 을 통 해 배열 정의
어떤 경우 에 사용 자 는 한 번 에 배열 의 모든 요소 에 값 을 제공 해 야 할 수도 있 습 니 다. 이때 사용 자 는 요소 값 집합 형식 으로 배열 을 정의 할 수 있 습 니 다. 기본 문법 은 다음 과 같 습 니 다. array=( v0 v1 v2 ... vn) array 는 배열 의 이름 을 표시 하고 모든 요 소 는 빈 칸 으로 구 분 됩 니 다.
#! /usr/bin/env bash

#通过集合定义数组
MyArray=(1 2 3 4)
#MyArray[@]表示MyArry的所有元素
echo "${MyArray[@]}"

Output:
$ sh test.sh
1 2 3 4

메모: 집합 을 사용 할 때 어떤 값 에 빈 칸 이 포함 되 어 있 으 면 작은 따옴표 나 작은 따옴표 로 값 을 묶 어야 합 니 다.
4. 키 값 을 통 해 정의 배열
이 방법 은 지 정 된 요소 값 을 통 해 배열 을 정의 하 는 것 과 유사 합 니 다. 문법 은 다음 과 같 습 니 다. array=([0]=value0 [1]=value1 [2]=value2 ... [n]=value[n]) 여기 서 array 5 는 배열 의 이름 이 고 등호 오른쪽 에 있 는 괄호 는 배열 요소 와 값 을 표시 합 니 다. 이런 방식 으로 배열 을 정의 하면 색인 은 연속 되 지 않 을 수 있 습 니 다.
#! /usr/bin/env bash

#通过集合定义数组
MyArray=([0]=1 [2]=2 [3]=3 [4]=4)
#MyArray[@]表示MyArry的所有元素
echo "${MyArray[@]}"

Output:
$ sh test.sh
1 2 3 4

5. 배열 과 일반 변수
Shell 에서 모든 변 수 는 실제 적 으로 배열 변수 로 사용 할 수 있 습 니 다.
#! /usr/bin/env bash

#定义字符串
Str="Hello World!"

echo "${Str[0]}  ${Str[@]} ${Str[*]}"

Output:
$ sh test.sh
Hello World! Hello World! Hello World!

위의 예 를 들 어 문자열 도 배열 로 사용 할 수 있 지만 이 배열 은 하나의 요소 만 있 습 니 다.注意:符号@和*都是通配符,表示匹配的所有元素,所以我们可以使用${array[@]}或者${array[*]表示数组的所有元素。
2. 배열 의 할당
1. 색인 에 따라 요소 값 부여
색인 방식 에 따라 값 을 부여 하고 지 정 된 요소 값 을 통 해 배열 을 정의 하 는 것 은 유사 합 니 다. 문법 은 다음 과 같 습 니 다. array[n]=Value array 는 배열 의 이름 이 고 n 은 할당 할 요소 색인 이 며 Valuen 은 대응 하 는 요소 값 입 니 다.
#! /usr/bin/env bash
#定义数组
Student=( random1 random2 random3)

echo "All Student are: ${Student[@]}"

#给数组赋值
Student[1]=hello
Student[3]=world

echo "All Student are: ${Student[@]}"

Output:
$ sh test.sh
All Student are: random1 random2 random3
All Student are: random1 hello random3 world

2. 집합 을 통 해 배열 할당
집합 을 통 해 배열 에 값 을 부여 하 는 것 과 집합 을 통 해 배열 을 정의 하 는 문법 은 같 습 니 다. array=( v0 v1 v2 ... vn) 배열 에 값 을 제공 할 때 셸 은 첫 번 째 요소 부터 차례대로 이 값 을 모든 요소 에 부여 합 니 다. 새로운 값 의 수량 이 원래 의 배열 을 초과 할 때 셸 은 배열 의 끝 에 새로운 요 소 를 추가 합 니 다. 새로운 값 의 개수 가 원래 의 길이 보다 적 을 때.셸 은 새로운 값 을 첫 번 째 요소 부터 할당 한 다음 초과 한 요 소 를 삭제 합 니 다.
#! /usr/bin/env bash
#定义数组
Student=( random1 random2 random3)

echo "All Student are: ${Student[@]}"

#给数组赋值
Student=( random_w1 random_w2 random_w3 random_w4)

echo "All Student are: ${Student[@]}"

#给数组赋值
Student=( random_w1 random_w2)

echo "All Student are: ${Student[@]}"

Output:
$ sh test.sh
All Student are: random1 random2 random3
All Student are: random_w1 random_w2 random_w3 random_w4
All Student are: random_w1 random_w2

3. 배열 끝 에 새 요 소 를 추가
셸 에 서 는 색인 을 통 해 배열 요소 에 값 을 부여 할 때 가리 키 는 색인 이 존재 하지 않 으 면 셸 은 자동 으로 새로운 요 소 를 추가 하고 배열 에 값 을 부여 합 니 다.
#! /usr/bin/env bash
#定义数组
Student=( random1 random2 random3)

echo "All Student are: ${Student[@]}"

#给数组赋值
Student[3]=random4

echo "All Student are: ${Student[@]}"

Output:
$ sh test.sh
All Student are: random1 random2 random3
All Student are: random1 random2 random3 random4

4. 순환 을 통 해 배열 에 값 을 부여 합 니 다.
실제 상황 에서 흔히 볼 수 있 는 것 은 순환 을 통 해 배열 에 값 을 부여 하 는 것 이다. 다음 과 같은 예 를 들 자.
#! /usr/bin/env bash

for i in {1..10}
do
    array[$i]=$i
done

echo "${array[@]}"

Output:
$ sh test.sh
1 2 3 4 5 6 7 8 9 10

3. 방문 배열
1. 첫 번 째 배열 요소 에 접근
앞에서 말 했 듯 이 우 리 는 배열 을 통 해 문자열 을 호출 할 수 있 습 니 다. 마찬가지 로 문자열 을 호출 하 는 형식 으로 배열 의 첫 번 째 요 소 를 호출 할 수 있 습 니 다.
#! /usr/bin/env bash

array=(1 2 3 4)

echo "${array}"

Output:
$ sh test.sh
1

2. 아래 표 시 를 통 해 배열 요소 에 접근
이것 은 우리 가 앞에서 이미 사용 한 것 이다. 문법 은 array[n] 로 배열 아래 n 으로 표 시 된 요 소 를 호출 하 는 것 을 나타 낸다. 여 기 는 더 이상 예 를 들 지 않 는 다.
3. 배열 의 길 이 를 계산한다.
셸 에서 우 리 는 $\# 를 사용 하여 배열 의 길 이 를 얻 을 수 있 습 니 다.이 연산 자의 기본 문법 은 다음 과 같다.${#array[@]} 또는 ${#array[*]}$\# 를 통 해 우 리 는 특정한 배열 요소 의 길 이 를 얻 을 수 있 습 니 다:${#array[n]}
#! /usr/bin/env bash
#给数组赋值
Student=( random_w1 random_w2 random_w3 random_w4)

echo "All Student are: ${Student[@]}, There are ${#Student[@]} students in all"

Output:
$ sh test.sh
All Student are: random_w1 random_w2 random_w3 random_w4, There are 4 students in all

4. 배열 요 소 를 반복 해서 옮 겨 다 니 기
이것 은 순환 을 통 해 배열 에 값 을 부여 하 는 역 과정 입 니 다.
#! /usr/bin/env bash
#给数组赋值
Student=( random_w1 random_w2 random_w3 random_w4)

for ((i=0;i<${#Student[@]};i++))
do
    echo "Student: ${Student[$i]}"
done

Output:
$ sh test.sh
Student: random_w1
Student: random_w2
Student: random_w3
Student: random_w4

5. 모든 배열 요 소 를 참조 합 니 다.
우 리 는 {array[@]}${array[*]} 방식 으로 배열 의 모든 요 소 를 인용 할 수 있다. 앞에서 우 리 는 이미 사용 한 적 이 있 는데 여 기 는 예 를 들 지 않 는 다.
6. 슬라이스 방식 으로 일부 배열 요 소 를 가 져 옵 니 다.
여기 서 말 하 는 절편 은 배열 의 일부 요소 나 특정한 요소 의 복 분 내용 을 캡 처 하 는 것 을 말한다. 예 를 들 어 특정한 배열 의 두 번 째 요 소 를 가 져 와 다섯 번 째 요 소 를 시작 하고 절편 을 가 져 오 는 문법 은 다음 과 같다. ${array[@|*]:start:length} 문법 에서 array 는 배열 의 이름 이 고 start 는 아래 표 시 된 곳 이 며 length 는 캡 처 할 길이 이다.위의 문법 을 통 해 우 리 는 문자열 을 얻 었 습 니 다. 만약 에 얻 으 려 면 양쪽 에 괄호 만 넣 으 면 됩 니 다. 예 를 들 어 (${array[@|*]:start:length})
#! /usr/bin/env bash
#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

echo "${Release[@]2:3}"

Release=(${Release[@]:2:3})
for ((i=0;i<${#Release[@]};i++))
do
    echo "${Release[$i]}"
done

Output:
$ sh test.sh
Suse Fedora UTS CentOS
Ubuntu
Suse
Fedora

Shell 에 서 는 배열 을 슬라이스 할 수 있 는 것 외 에 배열 의 요 소 를 슬라이스 할 수 있 습 니 다. 문법 은 다음 과 같 습 니 다. ${array[n]:start:length}
#! /usr/bin/env bash
#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

#这里截取CentOS的最后两个字符
echo "${Release[6]:4:2}"

Output:
$ sh test.sh
OS

7. 배열 요소 의 교체
Shell 에서 사용 자 는 배열 요 소 를 교체 할 수 있 습 니 다. 여기 서 의 교 체 는 특정한 배열 의 일부 내용 을 다른 문자열 로 대체 하 는 것 을 말 합 니 다. 그러나 원래 배열 의 값 에 영향 을 주지 않 습 니 다. 기본 문법 은 다음 과 같 습 니 다. ${array[@|*]/pattern/replacemant} 위의 문법 에서 array 는 배열 의 이름 을 표시 하고 pattern 은 교체 할 문자열 을 표시 합 니 다.replacement 은 바 꿀 문자열 을 표시 합 니 다.
#! /usr/bin/env bash

#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

echo "New array: ${Release[@]/Ubuntu/random_w}"

echo "Old array: ${Release[@]}"

Output:
$ sh test.sh
New array: Debian Redhat random_w Suse Fedora UTS CentOS
Old array: Debian Redhat Ubuntu Suse Fedora UTS CentOS

4. 배열 삭제
1. 지정 한 배열 요소 삭제
다른 Shell 변 수 를 삭제 하 는 것 과 마찬가지 로, 우 리 는 unset 를 사용 하여 그룹의 요 소 를 삭제 할 수 있 습 니 다: unset array[n]
#! /usr/bin/env bash

#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

unset Release[2]
echo "New array: ${Release[@]}"

Output:
$ sh test.sh
New array: Debian Redhat Suse Fedora UTS CentOS

2. 전체 배열 삭제
마찬가지 로 우 리 는 unset 명령 을 사용 하여 배열 을 삭제 합 니 다 unset array
#! /usr/bin/env bash

#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

unset Release
echo "New array: ${Release[@]}"

Output:
$ sh test.sh
New array:

5. 배열 의 기타 조작
1. 배열 복사
Shell 에서 사용 자 는 다음 과 같은 방식 으로 배열 의 할당 을 실현 할 수 있 습 니 다. newarray=("$array[@]")
#! /usr/bin/env bash

#给数组赋值
Release=( Debian Redhat Ubuntu Suse Fedora UTS CentOS)

Release2=("${Release[@]}")
echo "Release2: ${Release2[@]}"

Output:
$ sh test.sh
Release2: Debian Redhat Ubuntu Suse Fedora UTS CentOS

2. 연결 배열
두 배열 을 연결 하 는 방식 도 간단 하 다. 문법 은 다음 과 같다. ("$array1[@]" "$array2[@]")
#! /usr/bin/env bash

#给数组赋值
Release1=( Debian Redhat Ubuntu)
Release2=( Suse Fedora UTS CentOS)

Release=("${Release1[@]}" "${Release2[@]}")
echo "Release2: ${Release[@]}"
```bash
$ sh test.sh
Release2: Debian Redhat Ubuntu Suse Fedora UTS CentOS

3. 파일 내용 을 배열 로 불 러 오기
Shell 에서 사용 자 는 일반 텍스트 의 내용 을 배열 에 직접 불 러 올 수 있 습 니 다. 파일 의 줄 마다 배열 의 요소 입 니 다.
[root@random_wz ~]# cat student.txt
random_w1
random_w2
random_w3
random_w4
#! /usr/bin/env bash

#给数组赋值
Student=(`cat "student.txt"`)

echo "Student: ${Student[@]}"

Output:
[root@random_wz ~]# sh test.sh
Student: random_w1 random_w2 random_w3 random_w4

좋은 웹페이지 즐겨찾기