bash構文エラー:配列を解析するときに算術演算子が正しくありません( '.google.com'タグ付きエラー)。

bash構文エラー:配列を解析するときに算術演算子が正しくありません( '.google.com'タグ付きエラー)。

ドメイン配列があり、これを繰り返して、ファイル内の文字列が配列のドメインと一致することを確認します。ただし、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出力が変数に格納される方法に問題があるのでしょうか?

答え1

配列の文字列要素を数値インデックスとして使用します。

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次のように処理されます。シェル変数

    • 算術式では、変数の前にドル記号を付ける必要はありません。
    • テスト:a=5; b=7; echo $(( a * b ))
  2. しかし、算術的に言えば演算子がないので、パーサは残りの式.で何をすべきかわかりません。

答え2

Bashで配列を繰り返す2つの標準的な方法があります。 1つのオプションは、要素値を直接繰り返すことです。これにより、「www.google.com」elem、次に「www.bing.com」などに設定されたループが実行されます。

sites=("www.google.com" "www.bing.com" "www.yahoo.com" "www.duckduckgo.com")
for elem in "${sites[@]}"; do
    echo "The element is: $elem"
done

別のオプションは、配列を繰り返すことです。索引つまり、0、1、2などです。 (ここで${sites[0]}「www.google.com」は${sites[1]}「www.bing.com」などです。)

for i in "${!sites[@]}"; do    # The ! makes it list indexes, rather than elements
    echo "The $i'th element is: ${sites[i]}"
done

ここでの問題は、これらのメソッドを混合して要素値を繰り返し、それをインデックスとして扱うことです。

その他の質問:

csvString=($echo "$line");

($まず第一に、$(第二に使用しないでください$(echo ...)echo$( )大部分は互いに相殺します(望ましくない可能性がある奇妙な解析ケースを除いて)。これを使用してください:

csvString=$line

ところで、私が最後にセミコロンを入れていないことをご存知ですか?シェルでは、シェルの行末にセミコロンを使用する必要はありません(デュアルcaseセミコロン終了オプションなど、いくつかの奇妙な場合を除く)。同じ行に複数のコマンドに似た項目を配置する場合にのみ必要です。たとえば、次のようになります。

if somethingorother; then
    echo "this"; echo "that"
fi

次のように等しく作成できます。

if somethingorother
then
    echo "this"
    echo "that"
fi

関連情報