我有一个域数组,我试图遍历并检查文件中的字符串是否与数组中的任何域匹配。但是,当 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 输出存储在变量中的方式有问题?
您正在使用数组的字符串元素作为数字索引:
在数字索引数组中,解引用时,方括号中的索引部分实际上是一个算术表达式。这使您可以进行索引算术
x[i]=${x[i+1]}
,例如。要重现错误:
为了演示数组索引的算术性质,让我们看一下算术表达式中的字符串:
同样的错误。
错误标记是“.google.com”——这是为什么呢?
解析时
$((www.google.com))
,该www
部分将被视为shell 变量。a=5; b=7; echo $(( a * b ))
但是,从算术上讲,没有
.
运算符,因此解析器不知道如何处理表达式的其余部分。有两种标准方法可以在 bash 中迭代数组。一种选择是直接循环元素值。这将运行
elem
设置为“www.google.com”的循环,然后使用“www.bing.com”等:另一种选择是遍历数组索引,即 0、1、2 等(其中
${sites[0]}
是“www.google.com”,${sites[1]}
是“www.bing.com”等):这里的问题是您混合了这些方法,循环遍历元素值,然后将它们视为索引。
其他一些问题:
首先,
($
应该是$(
,其次你不应该使用$(echo ...)
-echo
和$( )
大部分相互抵消(除了你可能不想要的一些可能的解析异常)。只需使用这个:顺便说一句,请注意我没有在末尾添加分号?在 shell 中,shell 中的行尾不需要分号(除了一些奇怪的情况,比如结束
case
选项的双分号)。仅当您将多个类似命令的内容放在同一行时才需要它们。例如,这个:可以等价写成: