変数宣言が機能しない

変数宣言が機能しない

私のシステムには次のスクリプトがあります。

#!/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

関連情報