Bash 기술: 키 값 이 관련 배열, 1 차원 색인 배열 에 대한 용법 을 자세히 설명 합 니 다.
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_name
bash 는 변수의 유형 을 명확 하 게 지정 하 라 고 요구 하지 않 기 때문에 설명 하지 않 아 도 되 고 배열 의 방식 으로 변 수 를 직접 할당 하면 됩 니 다.help declare 가
-a
옵션 에 대한 설명 은 다음 과 같 습 니 다.-a
to make NAMEs indexed arrays (if supported)
declare -a
성명 을 사용 한 배열 은 기본적으로 숫자 를 배열 로 표시 하고 배열 의 길 이 를 지정 할 필요 가 없습니다.그 할당 방식 은 다음 과 같다.$ declare -a array=(1 2 "30" "40" 5)
$ echo ${array[@]}
1 2 30 40 5
$ 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")'
$ 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 을 배열 로 표시 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.