변수 추가 오류 [닫기]

변수 추가 오류 [닫기]

다음 bash 스크립트를 실행할 때:

Success: $(grep success * | grep B2B | wc -l)
etc_error: $(grep etc_error * | grep B2B | wc -l)
map_timeout: $(grep map_timeout * | grep B2B | wc -l)

success=$(grep success * | grep B2B | wc -l)
etc=$(grep etc_error * | grep B2B | wc -l)
map=$(grep map_timeout * | grep B2B | wc -l)

sum=$(($success + $etc + $map))
total=$(($success / $sum))
echo $total

오류가 발생합니다.

-bash: + + : syntax error: operand expected (error token is "+ ")

내 스크립트에 문제가 있나요?

답변1

이것이 모든 것을 설명하지는 않습니다. 변수 선언이 주어지면 값이 있어야 합니다.산술 확장$, 정의되지 않은 변수를 도입할 필요가 없습니다 . 기본값은 0입니다.

sum=$((success + etc + map))
total=$((success / sum))
echo "$total"

이상적으로는 나누기 전에 0이 아닌지 확인해야 sum하지만 확인하지 않더라도 sum("구문 오류: 피연산자가 예상됨" 대신 "0으로 나누기", 이 접근 방식에서는 최소한 합리적인 오류 메시지가 표시됩니다) 세게 때리다).

귀하가 받고 있는 오류는 다음과 같습니다.

sum=$(($success + $etc + $map))

어떤 이유로 , successetc모두 map정의되지 않았거나 비어 있습니다. 쉘은 위의 내용을 다음과 같이 확장합니다.

sum=$(( + + ))

그런 다음 확장을 시도하면 인용한 구문 오류가 발생합니다.

이것은 매우 놀라운 일이기 때문에

success=$(grep success * | grep B2B | wc -l)

가치를 생산해야 한다...

그런데 위의 내용을 다음과 같이 개선하고 싶을 수도 있습니다.

success=$(grep success ./* | grep -c B2B)

아니면 B2B매칭을 원하시면성공파일 이름 대신 줄:

success=$(cat ./* | grep success | grep -c B2B)

또는 GNU와 호환되거나 grep:

success=$(grep -h success ./* | grep -c B2B)

답변2

변수 중 하나가 설정되지 않거나 숫자 값이 없으면 추가 구문이 실패하므로 추가하기 전에 변수를 확인해야 합니다.

설정하기 전에 vars를 0으로 기본값을 지정하면 이를 방지할 수 있습니다.

관련 정보