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

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

#!/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 
  • Поиск файлов более поздним, чем один день, и копия
  • grepping конкретная матрица и печать в одной строке
  • if / then цикл с использованием `cat`
  • Передавать параметр из одного сценария оболочки в другой
  • Есть ли «обратное судо»?
  • Невозможно получить фактический подсчет строк из-за возврата каретки в значения:
  • Хранить задержанный вывод оболочки в переменную?
  • Можно ли заменить «затем» на скобки?
  • Bash: синтаксическая ошибка около неожиданного токена 'done'
  • Как я могу либо зашифровать, либо сделать мой сценарий оболочки нечитаемым?
  • Как проверить файлы ~ application / x-trash
  • Linux и Unix - лучшая ОС в мире.