não funciona

2

Eu tenho o script abaixo no meu sistema:

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

Não funciona quando eu o executo.

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

Qual é o problema com a variável declarada? Você poderia me ajudar?

    
por Fabio Becamp 17.09.2013 / 19:41

2 respostas

2

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

Há um erro de sintaxe aqui. Em uma atribuição, você precisa colocar um nome de variável antes do = . Um pedaço de texto mais longo que se expande para um nome de variável não é suportado.

Em vez de gerar nomes de variáveis a partir de partes, use matrizes associativas indexadas pela parte variável. Isso requer um shell que suporte matrizes associativas: ksh93, bash ou zsh. Enquanto você está nisso, não analise a saída de find (pode funcionar aqui, mas não funciona em geral quando os nomes de arquivo podem conter espaços em branco ou \[*? ). Use globalização e matrizes de shell.

#!/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
    
por 18.09.2013 / 02:59
0

Seu problema básico aqui é citar. Além disso, eu usaria uma matriz associativa (e bash em vez de sh ) em vez de tentar concatenar os nomes das variáveis (isso pode ser possível, mas não consegui fazê-lo funcionar). Os detalhes dos seus erros provavelmente dependem dos nomes de arquivos específicos que você tem, mas tente isso:

#!/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
    
por 17.09.2013 / 20:32