установить последнюю версию R 3.2.1 (World-Famous Astronaut) на Linux Mint 17.1 (MATE)

Основная ошибка заключается в том, что вы на самом деле не объявляете ассоциативный массив:

$ weekdays=(["Mon"]=1 ["Tue"]=1 ["Wed"]=1 ["Thu"]=1 ["Fri"]=1 ["Sat"]=1 ["Sun"]=1)
$ echo ${weekdays[@]}
1
$ echo ${weekdays[0]}
1
$ echo ${weekdays[2]}

$

Я не совсем уверен, как bash с ним справляется и почему он просто принимает 1 , но я уверен, что это не ассоциативный массив. Как объясняется в man bash (выделено мной):

Индексированный массив создается автоматически, если какой-либо переменной присвоено имя синтаксиса [индекс] = значение. Нижний индекс обрабатывается как арифметическое выражение, результатом которого должно быть число . Чтобы явно объявить индексированный массив, используйте declare -a name (см. ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ ниже). declare -a имя [нижний индекс] также допускается; субскрипт игнорируется.

Ассоциативные массивы создаются с использованием параметра declare -A name.

Итак, попробуйте это вместо этого, и он будет работать так, как вы ожидаете:

declare -A weekdays=(["Mon"]=1 ["Tue"]=1 ["Wed"]=1 ["Thu"]=1 ["Fri"]=1 ["Sat"]=1 ["Sun"]=1)

Тем не менее, ваш сценарий немного сложнее, чем вам нужно. Вот более простая версия, использующая тот же подход:

#!/bin/bash
declare -A weekdays=(["Mon"]=1 ["Tue"]=1 ["Wed"]=1 ["Thu"]=1 ["Fri"]=1 ["Sat"]=1 ["Sun"]=1)
input="/Foo/Bar.log"

cut -c 1-3 "$input" | while read -r line; do
    if [[ ${weekdays["$line"]} ]]
    then
            echo "Match : $cutline : ${weekdays[$line]}"
    else
            echo "No Match"
    fi
done    

Хотя я, вероятно, сделал бы это так:

#!/bin/bash
cut -c 1-3 "$1" | while read -r line; do
        case $line in
        "Mon"|"Tue"|"Wed"|"Thu"|"Fri"|"Sat"|"Sun")
                        echo yes;;
                *)
                        echo no;;
        esac
done

Затем запустите сценарий с именем целевого файла в качестве аргумента:

script.sh /Foo/Bar.log"
0
08.07.2015, 11:31
0 ответов

Теги

Похожие вопросы