Почему я продолжаю получать синтаксическую ошибку в моем скрипте bash? Есть ли что-то связанное с ":"? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь подсчитать ошибки для каждого элемента в моем массиве errorList, но получаю «синтаксическую ошибку в выражении (маркер ошибки:«: просто тест »)».

#!/bin/bash

declare -a errorList=(
    'MEDIA ERROR: just a test'
    'MEDIA BLA: resource unavaliable!'
    'DIALOG: Found PROBLEM ev_id="EV_ID"'
    )

declare -a errorListNames=(
    "Silence"
    "Unavaliable"
    "Environment error"
    )

pathLogs="/home/logs_test/"
logFileName="media.log.*"

dateLog="10-10-2019"

fgrep "$dateLog" $pathLogs$logFileName > grepedByDate.txt

for i in "${errorList[@]}"
    do
        fgrep -c "${ errorList[i], }" grepedByDate.txt
        echo "${errorListNames[i]}"
    done

echo "Bye"

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы можете использовать ассоциативный массив:

#!/usr/bin/env bash

declare -A errors=(
    [Unavailable]='MEDIA ERROR: Resource unavailable'
)

for i in "${!errors[@]}"; do
    echo "$i: ${errors[$i]}"
done  
  • ${!errors[@]} расширяется до ключей (Unavailable, ...) и сохраняется в $i
  • ${errors[$i]} расширяется до значений для данного ключа $i (MEDIA ERROR..., ...)
1 голос
/ 14 октября 2019

1. Используйте ! или # для получения ключей

Вместо:

for i in "${errorList[@]}"

используйте:

for i in ${!errorList[@]}"

или:

maxIndex=${#errorList[@]}
for (( i=0; i<$maxIndex; i++ ))

2. Пробелы значимы внутри ссылок на переменные

Вместо:

        fgrep -c "${ errorList[i], }" grepedByDate.txt

использование:

        fgrep -c "${errorList[i]}" grepedByDate.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...