인수를 정수로 변환하여 산술을 수행 한 다음 인쇄하는 방법을 찾으려고합니다 addOne.sh
.
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
답변
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
답변
다른 방법으로, 당신은 사용할 수 있습니다 expr
전의:
$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
답변
에서 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
답변
Linux 및 OSX 환경 모두에서 실행되는 bash 스크립트를 개발할 때도 비슷한 상황이 발생했습니다. OSX에서 한 명령의 결과는 결과 코드가 포함 된 문자열을 리턴했습니다. 즉 " 0"
. 물론 다음과 같은 경우에는 올바르게 테스트하지 못했습니다.
if [[ $targetCnt != 0 ]]; then...
해결책은 @ John1024가 위에서 응답 한 것과 비슷한 결과를 정수로 강제 (즉, ‘변환’)하여 예상대로 작동하는 것입니다.
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
답변
색상 코드에 대해주의를 기울이면 트레이스 ( -x
) 에도 나타나지 않습니다. 인쇄 방법에 관계없이 숫자로되어있는 문자열은 따옴표로 묶어야합니다.