Bash

bash 語法錯誤:通過數組解析時算術運算符無效(錯誤標記為“.google.com”)

  • January 8, 2020

我有一個域數組,我試圖遍歷並檢查文件中的字元串是否與數組中的任何域匹配。但是,當 for 循環開始時,我得到一個錯誤

line 64: www.google.com: syntax error: invalid arithmetic operator (error token is ".google.com")

數組和 for 循環如下所示:

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

我目前不知所措,也許是 grep 輸出儲存在變數中的方式有​​問題?

您正在使用數組的字元串元素作為數字索引:

for i in "${sites[@]}"; do
   if [ "$greppedDomain" = "${sites[$i]}" ]

在數字索引數組中,解引用時,方括號中的索引部分實際上是一個算術表達式。這使您可以進行索引算術x[i]=${x[i+1]},例如。

要重現錯誤:

$ x=(a b c)
$ i="www.google.com"
$ echo "${x[i]}"
bash: www.google.com: syntax error: invalid arithmetic operator (error token is ".google.com")

為了展示數組索引的算術性質,讓我們看一下算術表達式中的字元串:

$ echo $((www.google.com))
bash: www.google.com: syntax error: invalid arithmetic operator (error token is ".google.com")

同樣的錯誤。

錯誤標記是“.google.com”——這是為什麼呢?

  1. 解析時$((www.google.com)),該www部分將被視為shell 變數
  • 在算術表達式中,變數不需要以美元符號作為前綴
  • 測試:a=5; b=7; echo $(( a * b ))
  1. 但是,從算術上講,沒有.運算符,因此解析器不知道如何處理表達式的其餘部分。

引用自:https://unix.stackexchange.com/questions/524721