Основная ошибка заключается в том, что вы на самом деле не объявляете ассоциативный массив:
$ 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"