다음 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))
어떤 이유로 , success
및 etc
모두 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으로 기본값을 지정하면 이를 방지할 수 있습니다.