Eu tenho uma matriz de domínios que estou tentando percorrer e verificar se uma string de um arquivo corresponde a qualquer um dos domínios da matriz. No entanto, quando o loop for inicia, recebo um erro
line 64: www.google.com: syntax error: invalid arithmetic operator (error token is ".google.com")
o array e o loop for ficam assim:
sites=("www.google.com" "www.bing.com" "www.yahoo.com" "www.duckduckgo.com")
while read line; do
csvString=$(echo "$line");
greppedDomain=$(echo "$line" | grep -Eo '[A-Za-z0-9]{2,62}\.[A-Za-z0-9]{2,62}\.[A-Za-z]{2,62}');
for i in "${sites[@]}"; do
if [ "$greppedDomain" = "${sites[$i]}" ]
then
sitesOut+=($csvString);
fi
done
done < sitelist.txt
Atualmente estou com uma perda, talvez seja um problema com a maneira como a saída do grep é armazenada na variável?
Você está usando um elemento string do array como o índice numérico:
Em uma matriz indexada numericamente, ao desreferenciar, a parte do índice entre colchetes é na verdade uma expressão aritmética. Isso permite que você faça aritmética de índice como,
x[i]=${x[i+1]}
por exemplo.Para reproduzir o erro:
Para demonstrar a natureza aritmética do índice do array, vamos ver a string em uma expressão aritmética:
Mesmo erro.
O token de erro é ".google.com". Por que isso?
ao analisar
$((www.google.com))
awww
parte será tomada como uma variável de shell .a=5; b=7; echo $(( a * b ))
mas, aritmeticamente, não há
.
operador, então o analisador não sabe o que fazer com o resto da expressão.Existem duas maneiras padronizadas de iterar sobre uma matriz no bash. Uma opção é fazer um loop sobre os valores do elemento diretamente. Isso executará o loop com
elem
definido como "www.google.com", depois com "www.bing.com", etc:A outra opção é fazer um loop sobre os índices do array , ou seja, 0, 1, 2, etc (onde
${sites[0]}
é "www.google.com",${sites[1]}
é "www.bing.com", etc):O problema aqui é que você misturou esses métodos, fazendo um loop sobre os valores dos elementos, mas depois os tratando como índices.
Alguns outros problemas:
Em primeiro lugar, o
($
deve ser$(
, e em segundo lugar você não deve usar$(echo ...)
-- oecho
e a$( )
maioria se cancelam (exceto por algumas estranhezas de análise que você provavelmente não deseja). Basta usar isso:BTW, notou que eu não coloquei um ponto e vírgula no final? No shell, você não precisa de ponto e vírgula no final das linhas no shell (exceto alguns casos estranhos, como o ponto e vírgula duplo que encerra
case
as opções). Você só precisa deles se estiver colocando várias coisas semelhantes a comandos na mesma linha. Por exemplo, isso:Poderia ser escrito de forma equivalente: