2012-01-04 3 views
16

다음은 간단한 쉘 코드입니다. 그 결과는 2가 되길 바란다. 쉘은 모든 것을 문자열로 취급한다. 어떻게해야합니까?셸에 정수가 추가되었습니다.

num=1 
num=$(($num + 1)) 

편집 :

전체 코드 : 무슨 잘못이의 내가 10 1에서 인쇄하려면? bash에서

#! /bin/bash 

num=1 
until test $num -eq 10 
do 
    num=$(($num + 1)) 
    echo $num 
done 
+0

변경을'! $$에 관한 그것의 누구나!! –

+0

먼저, num을 이미 2로 반향 시키므로, num = 1을 num = 0으로 변경하여 모든 숫자를 인쇄해야합니다. 1 & 10 + 1 & 10 + Fredrik에서 제공 한 교정 –

+0

삭제 이것은 당신의 질문에 대답하기 위해 시간을 투자 한 사람들에게는 불공평 할 것입니다. – NullUserException

답변

-1

작품 당신은 무엇 출력을 얻을 수 있습니까?

tldp

bash는 10 시간 사용할 수있는 뭔가를 편집 @ bash는 산술에 대해 자세히 알아보기 (brace-expansion}

$ for i in {1..10}; do echo $i; done 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

그러나 사용하여, 당신은 {} 사이에 변수를 사용할 수 없습니다 이 경우 대신 seq을 사용하십시오.

+0

-1 세방은 틀리지 않습니다. 세번 이후의 여백은 괜찮습니다. – dogbane

+0

너무 빠르다, 고정 –

1

단지 한 : 당신은 $(()) 내부 변수를 인용 할 필요가 없습니다 :

$ num=1; num=$(($num + 1));echo $num 
2 

참고. 또한, 당신은 단지 $((num++))

0

num을 증가하기위한 속기로이

$ num=1; num=`expr $num + 1`; echo $num; 
+0

나는 그것이 작동 num = 1 체크; num ='expr $ num + 1'; echo $ num; – vkantiya

0

사용 ((num++))을 시도 할 수 있습니다. 또한 KSH처럼, 비 bash는 쉘에서 작동

num=1 
num=`expr $num + 1` 

:

$ num=1 
$ ((num++)) 
$ echo $num 
2 
-1

당신은 같은 것을 사용할 수 있습니다. 당신은 지정하지

+1

이것은 작동하지 않습니다. '$? '는 마지막 명령의 종료 상태 인 0입니다. – dogbane

+0

오, 맞습니다. 잘못된 복사/붙여 넣기입니다. 반복을 위해 – tonio

0

은 사용중인 쉘,하지만 내가 아는 가장 간결한 형태이 하나 (적어도 bash는 작동)입니다 :

num=$[num+1] 

만약 하나 씩 증가하고 오히려 변수 자체를 변경 인쇄/지정보다 :

((num++)) 

더 좋고/더 우아한 해결책입니다. 그것에 대한 도그 반의 대답을보십시오.

값을 통해 반복하는 것은, 내가 대신이 양식을 사용한다면 :

for i in `seq 1 10`; do 
    echo $i 
done 
+1

을 수정했습니다.'seq'를 호출하는 대신'{1..10}'을 선호합니다. – dogbane

2

@tonio을; subshell (`... or $ (...)) 구문을 사용하지 말라. ($ ((...))가 서브 쉘 구조가 아닐 때). 하위 셸은 사소한 양의 데이터로도 엄청난 성능 저하를 일으킬 수 있습니다. 외부 프로그램을 사용하여 쉘을 내장하여 수행 할 수있는 일을하는 모든 장소에서도 마찬가지입니다.

예 :

num=1 
    time while [[ $num -lt 10000 ]]; do 
      num=$((num+1)) 
    done 
    echo $num 
    num=1 
    time while /bin/test $num -lt 10000; do 
      num=$(/bin/expr $num + 1) 
    done 
    echo $num 

출력 (리눅스에 KSH에서 실행) :

 
real 0m0.04s 
user 0m0.04s 
sys  0m0.01s 
10000 

real 0m20.32s 
user 0m2.23s 
sys  0m2.92s 
10000 

... 내가 인정 (100)의 매우 250의 런타임 요소 및 CPU-시간 요소 필자가 사용한 예제는 과장된 것이었지만 명시 적으로 모든 내장 기능을 무시할 것을 요구했지만, 새로운 프로세스를 생성하는 것이 가능할 때이를 피하고 가능한 경우이를 피하고 새 프로세스가 어디에 있는지를 알 수있는 셸을 알고 있습니다. 만들어진.

+0

내 시스템 (Debian)에서 ** test ** 및 ** expr **은 **/usr/bin **에 있습니다. – dimir

+0

경로 문제는 외부 실행 파일보다 쉘 내장을 선호하는 또 다른 이유입니다. Linux 부문조차도 조각화되어 있습니다 (예제 코드는 Slackware 시스템에 작성되었습니다). –

+0

'let' :'let num = num + 1' 또는'let num ++'을 사용하여 이중 대괄호를 생략 할 수 있습니다. – choroba

1

이 당신을 위해 작동 될 수 있습니다

num=1; ((num++)); echo $num 
2 

또는 (bash는 최소한) 루프

for num in {1..10}; do echo $num; done 

나에 대한

num=1; echo $((++num)) 
2 

for ((num=1; num<=10; num++)) { echo $num; } 

초 루프 더 유용한 많은 프로그램이 포함 된 경우 : '테스트 $ 인분의 -eq까지 10`에 대한 테스트는 num -eq 10`까지

for ((num=1,mun=10; num<=10; num++,mun--)) { echo $num $mun; } 
관련 문제