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에서 배열을 반복하는 두 가지 표준 방법이 있습니다. 한 가지 옵션은 요소 값을 직접 반복하는 것입니다. 그러면 "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

관련 정보