变量声明不起作用

变量声明不起作用

我的系统中有以下脚本:

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

这里有一个语法错误。在赋值中,您需要在=.不支持扩展为变量名称的较长文本。

使用由变量部分索引的关联数组,而不是从片段生成变量名称。这需要一个支持关联数组的 shell:ksh93、bash 或 zsh。当您这样做时,不要解析find(它可能在这里工作,但当文件名可能包含空格或 时它通常不起作用\[*?) 的输出。请改用 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

答案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

相关内容