2011-12-04 2 views
0

이름에 숫자가 포함 된 파일이 있습니다. 각 파일 번호는 "그룹"또는 숫자 범위에 속합니다. 내가 속한 그룹 내의 파일 번호와 일치시키고 그 파일을 변수로 내보내려고합니다. 나는이 작업을 수행하는 방법을 잘 모르겠어요,하지만 난 그것과 비슷한 것입니다 가정 : 최초의 열은 그룹 이름입니다bash에서 "격자 배열"을 사용하는 방법은 무엇입니까?

Array: 
(A, 1, 20) 
(B, 21, 34) 
(C, 35, 52) 
(D, 53, 68) 

을, 두 번째 열은 범위의 첫 번째 자리와 마지막 열은 범위의 마지막 숫자입니다.

if [ $num -ge "COLUMN2" ] && [ $num -le "COLUMN3" ]; then 
    groupname=COLUMN1 
fi 

내가 코딩에 새로운 해요 그냥 bash 쉘을 배우기 시작했다, 그래서 당신은 배쉬이 나에게 방법을 준 경우 정말 선호 : 그럼, 내가 좋아하는 뭔가를 적용 할 수 있습니다. 또한 두 번째 열은 while [ $num -ge "COLUMN3" ] 일 때 불필요한 것으로 알고 있지만 나중에 스크립트의 첫 번째 열이 필요합니다.

+0

수를 입력과 희망 출력에 대한 예를 든다. – drysdam

+0

두 그룹 수 사이에 간격이 있습니까? 위의 숫자는 간격없이 1에서 68로 바뀝니다. –

+0

입력은 임의의 수이고 출력은 해당 번호에 해당하는 그룹 이름이됩니다. 그래서 37을 입력하면 "C"가 출력됩니다. 파일에 차례대로 "총 숫자"가 추가되어 격차가 없습니다. 그러나 마지막 값보다 큰 숫자는 해당 숫자까지 올라간 그룹을 추가하라는 오류 메시지를 출력해야합니다. – DeoxNa

답변

2

bash는 정말하지만,이 목적을 위해 단일 차원 배열의 일련의 미세 다차원 배열을해야하지 않습니다

group_names=("A" "B" "C" "D") 
group_min=(1 21 35 53) 
group_max=(20 34 52 68) 

groupname= 
for ((i=0; i < ${#group_names[@]}; i++)); do 
    if [ $num -ge ${group_min[i]} ] && [ $num -le ${group_max[i]} ]; then 
     groupname="${group_names[i]}" 
     break 
    fi 
done 
if [ -z "$groupname" ]; then 
    echo "Oops, no matching group found!" 
fi 
+0

감사합니다. 비슷한 점을 생각해 봤지만 "깨끗한"방법이나 올바른 방법이 있는지 알고 싶었습니다. bash는 "다차원 배열"을 수행 할 수 없다는 것을 잘 알고 있습니다. (다차원 배열은 3 차원으로 확장되거나 1과 2로 확장됩니까? 마음이 섞이지 않을지라도 멋지겠군요) – DeoxNa

+0

왜해야할까요? for ((i = 0; i <$ {# group_names [@]}; i ++))'? $ {group_names [@]}의 x가 충분하지 않습니까? 나는 코딩에 익숙하지 않고이 둘의 장점과 차이점을 이해하고자한다. – DeoxNa

+0

1 : 서로 다른 언어의 배열 기능은 다르지만 일반적으로 배열은 원하는만큼의 크기를 가질 수 있습니다 (231 치수? 문제 없음). 2 :'$ {group_names [@]} "'(그룹 이름의 공백과 같은 문제를 피하기 위해 큰 따옴표를 사용)는 group_names 배열을 반복하는 데 사용되지만 참조 할 수는 없습니다 group_min 및 group_max의 해당 항목. 대신 배열 인덱스를 반복하고 세 배열의 값에 액세스하는 데 사용해야합니다. –

0

이 너무 당신을 위해 일 수 있습니다

$ number=51 group= 
$ array=("A 1 20" "B 21 34" "C 35 52" "D 53 68") 
$ for element in "${array[@]}" 
> do read key min max <<<"$element" 
> ((number >= min && number <= max)) && group=$key && break 
> done 
$ [[ $group ]] && echo "number=$number group=$group" || echo "number=$number no match" 
$ number=51 group=C 
관련 문제