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.