O erro básico é que você não está realmente declarando uma matriz associativa:
$ 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]}
$
Não sei ao certo como o bash está lidando com ele e por que ele leva apenas um 1
, mas tenho certeza de que esse não é um array associativo. Conforme explicado em man bash
(ênfase minha):
An indexed array is created automatically if any variable is assigned to using the syntax name[subscript]=value. The subscript is treated as an arithmetic expression that must evaluate to a number. To explicitly declare an indexed array, use declare -a name (see SHELL BUILTIN COM‐ MANDS below). declare -a name[subscript] is also accepted; the sub‐ script is ignored.
Associative arrays are created using declare -A name.
Então, tente isso e funcione conforme o esperado:
declare -A weekdays=(["Mon"]=1 ["Tue"]=1 ["Wed"]=1 ["Thu"]=1 ["Fri"]=1 ["Sat"]=1 ["Sun"]=1)
Dito isso, seu script é um pouco mais complexo do que você precisa. Aqui está uma versão mais simples usando a mesma abordagem:
#!/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
Embora eu provavelmente faça assim:
#!/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
Em seguida, execute o script com o nome do arquivo de destino como um argumento:
script.sh /Foo/Bar.log"