bash에서 문자열을 정수로 인수 인수


73

인수를 정수로 변환하여 산술을 수행 한 다음 인쇄하는 방법을 찾으려고합니다 addOne.sh.

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1

귀하의 질문을 형식화하려고 시도하지만 어떻게 든 명확하지 않습니다. printf "1 + %s\n" $1 won't do ?
Archemar

답변:


87

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

사용자 입력과 같은 문자열이 무엇인지 모르면 $ (()) 또는 (())을 사용하는 것이 안전하지 않습니다. 이것을 고려하십시오 : foo = foo ((foo + = 0)) 이것은 foo를 재귀 적으로 평가하려고 할 때 스크립트를 중단시킵니다. 동일 : foo = foo foo = $ ((foo + 0))
art

12

다른 방법으로, 당신은 사용할 수 있습니다 expr

전의:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3

10

에서 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

2
이것을 제외한 다른 쉘에서는 printf -v명령 대체를 통해 달성 할 수 있습니다.int="$(printf '%d' 123.123 2>/dev/null)"
Adrian Günter

2
이것은 bash에서 작동하지 않습니다.
Michael Martinez

@MichaelMartinez 확실합니까? bash사용한 버전은 무엇입니까 ?
cuonglm

GNU bash, 버전 4.2.46 (1)-릴리스 (x86_64-redhat-linux-gnu)
Michael Martinez

5

Linux 및 OSX 환경 모두에서 실행되는 bash 스크립트를 개발할 때도 비슷한 상황이 발생했습니다. OSX에서 한 명령의 결과는 결과 코드가 포함 된 문자열을 리턴했습니다. 즉 " 0". 물론 다음과 같은 경우에는 올바르게 테스트하지 못했습니다.

if [[ $targetCnt != 0 ]]; then...

해결책은 @ John1024가 위에서 응답 한 것과 비슷한 결과를 정수로 강제 (즉, '변환')하여 예상대로 작동하는 것입니다.

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...

3
==[[( [일명 일명 test)에서 문자열 비교를 수행합니다. 산술 비교를위한 다른 연산자 가 있습니다 [[ $targetcnt -ne 0 ]]. 조건식에서 맨 페이지 (또는 정보)를 참조하십시오. 공백을 구체적 으로 정리하기 위해 [따옴표없는 변수 확장과 함께 사용 하여 [ $targetcnt == 0 ]기본 단어 분할 ( [[)을 수행 할 수 있지만 일반적으로 이러한 접근 방식으로 인해 위험에 빠질 수 있습니다.
dave_thompson_085

-2

색상 코드에 대해주의를 기울이면 트레이스 ( -x) 에도 나타나지 않습니다. 인쇄 방법에 관계없이 숫자로되어있는 문자열은 따옴표로 묶어야합니다.


1
당신의 대답이 약간 불분명 한 것으로 판명되었습니다. 스크립트를 수정해야 할 내용을 추가 할 수 있습니까?
Time4Tea

이 bash는 + 정수 + 문자열 내가 답변 중 포함되지 않은 그와 관련된 정보의 조각을 추가 있도록 검색에서 상위 대답했다, 그 문자열이 색상 코드에 싸여 때와 같은 작업을하는 이유가 불분명 할 수있다 $((var+var))하더라도 실패 당신 echo이나 printf두 가지 모두 동일 하다면 . 출력 소스에서 색상 코드를 비활성화하여 해결할 수 있었기 때문에 수정 사항을 알 수 없습니다. 추적 로그에 자리하려면로 할당 잘못된 변수를 볼 수 있습니다 var='0'단순히해야합니다 동안var=0
untore

당신이 할 수있는 출력은 컬러 코드가없는 있는지 확인입니다 sed당신이 그것을 사용하지 않도록 설정할 수없는 경우
untore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.