답변:
bash에서 "산술을 수행하기 위해 인수를 정수로 변환하지 않습니다". bash에서 변수는 컨텍스트에 따라 정수 또는 문자열로 처리됩니다.
산술을 수행하려면 산술 확장 연산자를 호출해야합니다 $((...))
. 예를 들면 다음과 같습니다.
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
또는 일반적으로 선호되는
$ echo "$((a + 1))"
3
ksh93, zsh 또는 yash와 달리 bash는 정수 산술 만 수행한다는 점에 유의해야합니다 . 부동 소수점 숫자 (소수점이있는 숫자)가있는 경우 도움이되는 다른 도구가 있습니다. 예를 들어 다음을 사용하십시오 bc
.
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
또는 bash 대신 부동 소수점 산술 지원 쉘을 사용할 수 있습니다.
zsh> echo $((3.14 + 1))
4.14
에서 printf -v를bash
사용하여 모든 것을 정수로 변환 할 수 있습니다 .
printf -v int '%d\n' "$1" 2>/dev/null
부동 숫자는 정수로 변환되고 숫자처럼 보이지 않는 것은 0으로 변환됩니다. 지수는 이전의 숫자로 잘립니다. e
예:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
printf -v
명령 대체를 통해 달성 할 수 있습니다.int="$(printf '%d' 123.123 2>/dev/null)"
bash
사용한 버전은 무엇입니까 ?
Linux 및 OSX 환경 모두에서 실행되는 bash 스크립트를 개발할 때도 비슷한 상황이 발생했습니다. OSX에서 한 명령의 결과는 결과 코드가 포함 된 문자열을 리턴했습니다. 즉 " 0"
. 물론 다음과 같은 경우에는 올바르게 테스트하지 못했습니다.
if [[ $targetCnt != 0 ]]; then...
해결책은 @ John1024가 위에서 응답 한 것과 비슷한 결과를 정수로 강제 (즉, '변환')하여 예상대로 작동하는 것입니다.
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==
등 [[
( [
일명 일명 test
)에서 문자열 비교를 수행합니다. 산술 비교를위한 다른 연산자 가 있습니다 [[ $targetcnt -ne 0 ]]
. 조건식에서 맨 페이지 (또는 정보)를 참조하십시오. 공백을 구체적 으로 정리하기 위해 [
따옴표없는 변수 확장과 함께 사용 하여 [ $targetcnt == 0 ]
기본 단어 분할 ( [[
)을 수행 할 수 있지만 일반적으로 이러한 접근 방식으로 인해 위험에 빠질 수 있습니다.
색상 코드에 대해주의를 기울이면 트레이스 ( -x
) 에도 나타나지 않습니다. 인쇄 방법에 관계없이 숫자로되어있는 문자열은 따옴표로 묶어야합니다.
$((var+var))
하더라도 실패 당신 echo
이나 printf
두 가지 모두 동일 하다면 . 출력 소스에서 색상 코드를 비활성화하여 해결할 수 있었기 때문에 수정 사항을 알 수 없습니다. 추적 로그에 자리하려면로 할당 잘못된 변수를 볼 수 있습니다 var='0'
단순히해야합니다 동안var=0
sed
당신이 그것을 사용하지 않도록 설정할 수없는 경우
printf "1 + %s\n" $1 won't do ?