Bash 기술: 키 값 이 관련 배열, 1 차원 색인 배열 에 대한 용법 을 자세히 설명 합 니 다.

10044 단어 linuxbashshell
Bash 관련 배열 상세 설명
Bash 는 관련 배열 (associative arrays) 을 지원 합 니 다. 임의의 문자열 이나 정 수 를 아래 표 시 를 통 해 배열 요 소 를 방문 할 수 있 습 니 다.관련 배열 의 아래 표 와 값 을 키 값 쌍 이 라 고 하 는데, 그것들 은 일일이 대응 하 는 관계 이 며, 키 는 유일한 것 이 며, 값 은 유일 하지 않 을 수 있다.
관련 배열 을 사용 하기 전에 declare -A array_name 로 명시 적 성명 arrayname 변 수 는 관련 배열 입 니 다.
help declare 가 -A 옵션 에 대한 설명 은 다음 과 같 습 니 다.
-A
to make NAMEs associative arrays (if supported)
예 를 들 어 다음 문 구 는 filetypes 라 는 관련 배열 을 정의 하고 배열 에 값 을 부여 합 니 다.
$ declare -A filetypes=([txt]=text [sh]=shell [mk]=makefile)
$ filetypes[c]="c source file"

배열 이름 을 사용 하여 값 을 할당 할 때 는 작은 괄호 () 로 모든 값 을 묶 어야 합 니 다.
관련 배열 에서 괄호 [] 로 묶 은 값 은 key 입 니 다.네모 난 괄호 [] 에 부 여 된 값 은 이 키 에 대응 하 는 value 입 니 다.서로 다른 키 쌍 사 이 를 빈 칸 으로 구분 합 니 다.쉼표 로 구분 하 는 것 이 아니 라 주의 하 세 요.filetypes[key]=value 방식 으로 지정 한 관련 배열 요소 의 값 을 단독으로 할당 할 수도 있다.주어진 키 가 존재 하지 않 으 면 bash 는 자동 으로 생 성 됩 니 다.존재 한다 면 값 을 value 에 대응 하 는 값 으로 변경 합 니 다.
앞에서 정 의 된 filetypes 를 기반 으로 한 그룹 이름:
  • ${!filetypes[*]}: 관련 배열 의 모든 키 이름 을 가 져 옵 니 다. filetypes 앞 에 느낌표 가 있 습 니 다. '!'
    $ echo ${!filetypes[*]}
    txt sh c mk
  • ${!filetypes[@]}: 관련 배열 의 모든 키 를 가 져 옵 니 다.사용 *@ 의 차 이 를 설명 한다.
    $ echo ${!filetypes[@]}
    txt sh c mk
  • ${filetypes[*]}: 관련 배열 의 모든 값 을 가 져 옵 니 다.키 이름 을 가 져 오 는 표현 식 에 비해 앞의 느낌표 '!' 가 적 습 니 다.
    $ echo ${filetypes[*]}
    text shell c source file makefile
  • ${filetypes[@]}: 관련 배열 의 모든 값 을 가 져 옵 니 다.
    $ echo ${filetypes[@]}
    text shell c source file makefile
  • ${#filetypes[*]}: 관련 배열 의 길이, 즉 요소 개 수 를 가 져 옵 니 다.filetypes 앞 에 우물 번호 '\#' 가 있 습 니 다.
    $ echo ${#filetypes[*]}
    4
  • ${#filetypes[@]}: 관련 배열 의 길 이 를 가 져 옵 니 다. 즉, 요소 개수
    $ echo ${#filetypes[@]}
    4
  • ${filetypes[key]}: 키 라 는 키 이름 에 대응 하 는 값 을 가 져 옵 니 다.대괄호 {} 에 주의 하 는 것 은 필수 적 이다.
    $ echo ${filetypes[sh]}
    shell
    $ echo $filetypes[sh]
    [sh]        # 可以看到,不加大括号时,并不能获取到数组元素的值

  • man bash 의 Arrays 소절 을 보고 이 몇 가지 표현 식 의 의 미 를 설명 하 는 동시에 사용 *@ 의 차 이 를 언급 하여 구체 적 인 차 이 를 다음 과 같이 붙 였 다.
    If the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS special variable, and ${name[@]} expands each element of name to a separate word. When there are no array members, ${name[@]} expands to nothing. ${!name[@]} and ${!name[*]} expand to the indices assigned in array variable name. The treatment when in double quotes is similar to the expansion of the special parameters @ and * within double quotes.
    즉, * 을 사용 할 때 두 따옴표 로 전체 표현 식 을 묶 으 면 "${!name[*]}" 또는 "${name[*]}" 이 라 고 쓰 면 모든 값 을 하나의 문자열 로 합 친다.@ 을 사용 할 때 전체 표현 식 을 작은 따옴표 로 묶 으 면 "${!name[@]}" 또는 "${name[@]}" 문자열 배열 을 얻 을 수 있 습 니 다.각 배열 요 소 는 두 개의 따옴표 로 묶 기 때문에 배열 요소 자체 의 빈 칸 은 몇 개의 단어 로 나 누 지 않 습 니 다.
    구체 적 으로 아래 의 예 에서 보 듯 이 이것 도 배열 요 소 를 옮 겨 다 니 는 예 이다.
    $ for key in "${filetypes[*]}"; do echo "****:" $key; done
    ****: text shell c source file makefile
    $ for key in "${filetypes[@]}"; do echo "@@@@:" $key; done
    @@@@: text
    @@@@: shell
    @@@@: c source file
    @@@@: makefile
    "${filetypes[*]}" 문자열 만 생 성 되 고 for 순환 은 한 번 만 옮 겨 다 니 는 것 을 볼 수 있 습 니 다."${filetypes[@]}" 여러 문자열 이 생 성 되 었 습 니 다. for 는 여러 번 반복 되 며 문자열 배열 입 니 다.그리고 주어진 'c source file' 이라는 문자열 은 빈 칸 으로 몇 개의 단어 로 구분 되 지 않 았 습 니 다.
    위의 예 에서 도 배열 요 소 를 for 명령 으로 옮 겨 다 니 는 방법 을 보 여 주 었 다.declare -p 명령 을 사용 하여 배열 의 구체 적 인 키 쌍 관 계 를 볼 수 있 습 니 다.
    $ declare -p filetypes
    declare -A filetypes='([txt]="text" [sh]="shell" [c]="c source file" [mk]="makefile" )'

    Bash 의 1 차원 배열 상세 설명
    Bash 는 1 차원 배열 (one - dimensional indexed array) 만 지원 하고 2 차원 배열 은 지원 하지 않 습 니 다.1 차원 배열 을 설명 하 는 방식 은 다음 과 같다. declare -a array_namebash 는 변수의 유형 을 명확 하 게 지정 하 라 고 요구 하지 않 기 때문에 설명 하지 않 아 도 되 고 배열 의 방식 으로 변 수 를 직접 할당 하면 됩 니 다.
    help declare 가 -a 옵션 에 대한 설명 은 다음 과 같 습 니 다.
    -a
    to make NAMEs indexed arrays (if supported) declare -a 성명 을 사용 한 배열 은 기본적으로 숫자 를 배열 로 표시 하고 배열 의 길 이 를 지정 할 필요 가 없습니다.그 할당 방식 은 다음 과 같다.
  • array = (value 1 value 2 value 3... value N): 이 방식 은 배열 아래 표 시 된 0 부터 배열 요소 에 값 을 부여 합 니 다. 서로 다른 값 사 이 를 빈 칸 으로 구분 하고 주어진 값 은 숫자, 문자열 등 일 수 있 습 니 다.
    $ declare -a array=(1 2 "30" "40" 5)
    $ echo ${array[@]}
    1 2 30 40 5
  • array = ([0] = var 1 [1] = var 2 [2] = var 3... [n] = varN): 이러한 방식 으로 배열 아래 표 시 를 제공 하고 이 요소 의 할당 으로 지정 하 며 주어진 배열 아래 표 시 는 연속 되 지 않 을 수 있 습 니 다.
    $ declare -a array=([0]=1 [1]=2 [3]="30" [6]="60" [9]=9)
    $ echo ${array[@]}    # 用 ${array[@]} 获取所有数组元素的值
    1 2 30 60 9
    $ echo ${array[5]}    # 上面赋值的时候,跳过了数组下标 5,所以它对应的值为空
    
    $ declare -p array    # 使用 declare -p 命令查看,会打印出被赋值的所有元素
    declare -a array='([0]="1" [1]="2" [3]="30" [6]="60" [9]="9")'
  • array[0]=value1; array[1]=value2; ...; array [n] = varN: 이 방식 은 단독으로 배열 요소 에 값 을 부여 합 니 다.
    $ unset array; declare -a array
    $ array[0]=0; array[1]=1; array[7]="70"
    $ declare -p array
    declare -a array='([0]="0" [1]="1" [7]="70")'

  • 1 차원 배열 의 다른 용법 은 앞에서 소개 한 관련 배열 의 용법 과 같다.예 를 들 어 ${array[@]} 로 모든 배열 요소 의 값 을 얻 을 수 있 고 ${#array[@]} 로 배열 의 요소 개 수 를 얻 을 수 있 습 니 다.
    다음 코드 세 션 을 참고 하여 1 차원 배열 요 소 를 옮 겨 다 닐 수 있 습 니 다.
    for item in "${array[@]}"; do
        echo $item
    done

    1 차원 배열 은 정수 로 배열 요 소 를 색인 한다.음정 수의 아래 표 시 된 값 을 제공한다 면, 이것 은 특수 한 의 미 를 가지 고 있 으 며, 배열 의 끝 에서 부터 앞으로 색인 하 는 것 을 나타 낸다.예 를 들 어 array[-1] 은 배열 의 마지막 요 소 를 색인 하고 array[-2] 은 배열 의 마지막 두 번 째 요 소 를 색인 하 며 이에 따라 유추 된다.
    구체 적 인 예 는 다음 과 같다.
    $ declare -a array=([0]=0 [1]=1 [2]="20" [3]=3)
    $ echo ${array[-1]}, ${array[-3]}
    3, 1

    메모: declare -a 성명 한 배열 은 숫자 를 배열 로 표시 해 야 하지만 문자열 을 배열 로 표시 하 는 것 은 잘못 되 지 않 습 니 다.실제 테스트 에는 비교적 이상 한 점 이 있다.구체 적 인 예 는 다음 과 같다.
    $ declare -a array=([0]=0 [1]=1 [2]="20" [3]=3)
    $ array[index]=1000
    $ echo ${array[index]}
    1000
    $ array[new]=2000
    $ echo ${array[index]}
    2000
    $ echo ${array[new]}
    2000
    $ declare -p array
    declare -a array='([0]="2000" [1]="1" [2]="20" [3]="3")'
    array[index] 요소 에 값 을 부여 하 는 것 을 볼 수 있 습 니 다. 잘못 보고 하지 않 았 습 니 다. ${array[index]} 를 사용 하면 정상적으로 값 을 얻 을 수 있 습 니 다.그러나 array[new] 에 2000 을 부여 한 후 ${array[index]} index 라 는 문자열 아래 표 시 된 배열 요소 값 을 인쇄 한 결과 2000 이 되 었 고 ${array[new]} 인쇄 된 값 과 같 습 니 다.이 두 문자열 아래 표 시 는 같은 배열 요소 에 연 결 된 것 처럼 보 입 니 다.
    실제로 그것들 은 모두 수조 원소 0 에 대응한다.위의 declare -p array 명령 출력 [0] 이 요소 값 이 2000 으로 변 한 것 을 볼 수 있 습 니 다.
    man bash 의 Arrays 부분 을 보면 다음 과 같이 설명 합 니 다.
    Indexed arrays are referenced using integers (including arithmetic expressions) and are zero-based;
    An indexed array is created automatically if any variable is assigned to using the syntax name[subscript]=value. The subscript is treated as an arithmetic expression that must evaluate to a number.
    Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0.
    즉, indexed array 의 아래 표 지 는 반드시 숫자 이거 나 산술 표현 식 (arithmetic expressions) 을 통 해 계 산 된 숫자 입 니 다.배열 아래 표 시 를 제공 하지 않 으 면 기본적으로 배열 아래 표 시 를 0 으로 사용 합 니 다.
    bash 의 산술 표현 식 은 변수 값 을 가 져 올 때 $ 기 호 를 사용 할 필요 가 없 기 때문에 위의 array[index] 는 실제 array[$index] 에 해당 합 니 다. 즉, index 변수의 값 을 가 져 와 서 배열 의 아래 표 시 를 하 는 것 입 니 다.
    주어진 index 변수 에 값 이 없 으 면 배열 아래 표 시 를 제공 하지 않 은 것 과 같 습 니 다. 기본적으로 배열 아래 표 시 를 0 으로 사용 하기 때문에 array[index] 에 값 을 부여 합 니 다. 사실은 array[0] 에 값 을 부여 합 니 다.같은 이치 로 array[new] 의 값 을 부여 하 는 것 도 array[0] 의 값 을 부여 하 는 것 이 고 array[index] 의 값 도 따라서 바 뀌 는 것 을 볼 수 있다.
    만약 index 변수의 값 이 0 이 아니 고 new 변수 가 값 이 없다 면 array[index] 할당 값 은 array[new] 에 영향 을 주지 않 을 것 입 니 다.
    위의 예 를 바탕 으로 다음 문 구 를 계속 실행 합 니 다.
    $ index=1
    $ array[index]=100
    $ echo "array[index] = ${array[index]}, array[1] = ${array[1]}"
    array[index] = 100, array[1] = 100
    $ array[new]=900
    $ echo "array[new] = ${array[new]}, array[0] = ${array[0]}, array[index]=${array[index]}"
    array[new] = 900, array[0] = 900, array[index]=100
    $ recurse=index
    $ array[recurse]=500
    $ echo "array[index] = ${array[index]}, array[recurse] = ${array[recurse]}, array[1] = ${array[1]}"
    array[index] = 500, array[recurse] = 500, array[1] = 500

    index 변 수 를 1 로 할당 하고 array[index] 의 값 을 수정 하면 배열 아래 표 시 된 1 에 대응 하 는 요소, 즉 array[1] 의 값 을 바 꾸 는 것 을 볼 수 있 습 니 다.즉, $index 으로 이 변수의 값 을 배열 로 표시 하 는 것 과 같다.이때 new 변수 에 값 을 부여 하지 않 았 기 때문에 수정 array[new] 의 값 은 array[0] 에 연결 되 어 영향 을 주지 않 습 니 다 array[index].
    변 수 를 문자열 로 할당 하면 이 문자열 에 대응 하 는 변 수 를 가 져 옵 니 다.위 에서 recurse 할당 값 을 "index"문자열 로 변경 array[recurse] 의 값 을 보 았 습 니 다. array[1] 의 값 이 바 뀌 었 습 니 다.즉, recurse 변 수 를 먼저 $recurse 가 져 오 는 값 은 'index' 이 고 문자열 인 것 을 발견 하면 'index' 문자열 을 변수 이름 으로 계속 합 니 다.$index 로 index 변 수 를 가 져 오 는 값 은 1 이 며, 최종 적 으로 1 을 배열 로 표시 합 니 다.

    좋은 웹페이지 즐겨찾기