объявление переменной не работает

У меня есть следующий скрипт в моей системе:

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

В чем дело с объявленной переменной? Не могли бы вы помочь мне?

2 Solutions collect form web for “объявление переменной не работает”

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

Здесь есть синтаксическая ошибка. В задании вам нужно поставить имя переменной перед = . Более длинный фрагмент текста, который расширяется до имени переменной, не поддерживается.

Вместо генерации имен переменных из кусков используйте ассоциативные массивы, индексированные переменной частью. Для этого требуется оболочка, которая поддерживает ассоциативные массивы: ksh93, bash или zsh. Пока вы на нем, не разбирайте вывод find (он может работать здесь, но он вообще не работает, когда имена файлов могут содержать пробелы или \[*? ). Вместо этого используйте shell globbing и массивы.

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

Ваша основная проблема здесь – цитирование. Кроме того, я бы использовал ассоциативный массив (и 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 
  • Я неправильно использую цикл while?
  • Как закончить сценарий оболочки?
  • В то время как проверка состояния JBoss в цикле вниз или нет,
  • Получение количества строк и сохранение в результирующем наборе
  • Сценарий оболочки для создания дублированного вывода с шагом
  • Как использовать команды в файлах, начинающиеся с «-»
  • Bash (Ubuntu) - Строки в циклах?
  • Как преобразовать текст так, чтобы каждая выходная строка начиналась с названия блока?
  • проверять количество записей в заголовке
  • Сценарий оболочки для извлечения части имени файла из входного файла и преобразования его в выходной файл
  • Как обрабатывать подкоманду в сценарии оболочки?
  • Linux и Unix - лучшая ОС в мире.