변수 선언이 작동하지 않습니다

변수 선언이 작동하지 않습니다

내 시스템에는 다음 스크립트가 있습니다.

#!/bin/sh

LASTFILES=`find /var/log -mtime -1 -iname *.csv`

KEYWORDS="MD AG GA"

countMD="0"
countAG="0"
countGA="0"

for i in $LASTFILES ; do
    for a in $KEYWORDS ; do
        count_$a=`grep -a $date $i | grep -i "\"$a\"" | grep smsMoBilling | wc -l`
        count$a=`expr $count$a + $count_$a`
         done
done

실행해 보니 작동하지 않습니다.

./test.sh: line 35: count_MD=37: command not found
expr: non-numeric argument
./test.sh: line 36: countMD=: command not found

선언된 변수에 어떤 문제가 있나요? 도와주세요?

답변1

count_$a=`grep -a $date $i | grep -i "\"$a\"" | grep smsMoBilling | wc -l`

여기에 구문 오류가 있습니다. 과제에 를 추가해야 합니다 =. 변수 이름으로 확장되는 더 긴 텍스트는 지원되지 않습니다.

조각에서 변수 이름을 생성하는 대신 변수 부분으로 인덱싱된 연관 배열을 사용합니다. 이를 위해서는 연관 배열(ksh93, bash 또는 zsh)을 지원하는 셸이 필요합니다. 이 작업을 수행할 때 출력을 구문 분석하지 마십시오 find(여기에서는 작동할 수 있지만 일반적으로 파일 이름에 공백 또는 \[*?. 대신 셸 와일드카드와 배열을 사용하세요.

#!/bin/bash
shopt -s globstar
CSV_FILES=(/var/log/**/*.[Cc][Ss][Vv])
KEYWORDS=(MD AG GA)
typeset -A count
for i in "${CSV_FILES[@]}" ; do
    for a in "${KEYWORDS[@]}" ; do
        count[$a]+=$(grep -a "$date" "$i" | grep -i "\"$a\"" | grep smsMoBilling | wc -l)
    done
done

답변2

여기서 기본적인 문제는 인용입니다. 또한 변수 이름을 연결하는 대신 연관 배열( bash대신 ) 을 사용합니다 sh(가능할 수도 있지만 제대로 작동할 수는 없습니다). 오류의 세부 사항은 가지고 있는 특정 파일 이름에 따라 다를 수 있지만 다음을 시도해 보십시오.

#!/bin/env bash

LASTFILES=`find /var/log -mtime -1 -iname "*.csv"`

KEYWORDS="MD AG GA"

countMD="0"
countAG="0"
countGA="0"
declare -A count1;
declare -A count2;

for i in "$LASTFILES" ; do
    for a in "$KEYWORDS" ; do
         count1[$a]=`grep -a "$date" "$i" | grep -i "\"$a\"" | grep -c smsMoBilling`
         count2[$a]=$((${count2[$a]}+${count1[$a]}));
    done
done

관련 정보