도메인 배열이 있고 이를 반복하여 파일의 문자열이 배열의 도메인과 일치하는지 확인하려고 합니다. 그러나 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'입니다. 이유가 무엇인가요?
$((www.google.com))
이 섹션을 구문 분석할 때www
다음과 같이 처리됩니다.쉘 변수.- 산술 표현식에서는 변수 앞에 달러 기호를 붙일 필요가 없습니다.
- 시험:
a=5; b=7; echo $(( a * b ))
그러나 산술적으로 말하면 연산자가 없으므로
.
파서는 나머지 표현식으로 무엇을 해야할지 모릅니다.
답변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