두 개의 배열이 있고 ARRAY1의 해당 값을 기반으로 ARRAY2의 값을 인쇄하고 싶습니다.
#!/usr/bin/env bash
ARRAY1=(bb.service.sql bw.service.sql)
ARRAY2=(bb bw)
case $ARRAY1[@] in
${ARRAY1[1]})
echo ${ARRAY2[1]} ;;
*)
echo "unknown" ;;
esac
하지만 난 아직 unknown
여기까지 오는 중이야. 내가 뭘 잘못했나요?
답변1
$ARRAY1
${ARRAY1[0]}
bash
in (ksh에서 복사한 이상한 디자인) 의 약어입니다 .
$ARRAY1[@]
와 동일 ${ARRAY[0]}[@]
하므로 인덱스 0에 있는 요소의 값 뒤에는 리터럴이 옵니다 [@]
. 많은 언어와 많은 셸( csh
배열이 있는 첫 번째 셸 부터 시작)에서 $array[1]
ksh와 마찬가지로 bash에서 배열을 인덱싱할 수 있지만 이렇게 해야 합니다 ${array[1]}
. 이는 배열이 없는 Bourne 쉘과의 하위 호환성을 유지하기 위해 수행됩니다.
${array[@]}
배열의 모든 요소로 확장되지만 여기서는 case
문자열만 일치하므로 요소는 공백으로 연결되어 case
일치됩니다.
또한 배열을 할당할 때 array=(foo bar)
1 이 아닌 를 foo
입력하십시오 ${array[0]}
(ksh와 동일하지만 array=(values...)
이 구문의 소스인 zsh를 포함한 대부분의 다른 쉘과 달리).
어쨌든, 당신이 그것으로 무엇을 하고 싶은지 명확하지 않습니다.
bb
에 매핑하고 싶을 수도 있습니다 bb.service.sql
. 이 경우 연관 배열을 사용하는 것이 좋습니다.
#! /bin/bash -
typeset -A map=(
[bb]=bb.service.sql
[bw]=bw.service.sql
)
first_parameter=${1?}
corresponding_sql=${map[$first_parameter]?}
( ?
변수를 설정하지 않으면 에러가 발생합니다.)