2016-11-11 2 views
1

저는 Bash Scripting을 처음 사용하기 때문에보다 기본적인 것들을 온라인으로 찾을 수 없습니다. 내 작업은 사용자 입력을 받아서 짝수를 2로 나눈 다음 홀수를 3으로 곱하고 1을 더하여 프로그램을 실행하는 것입니다. 고급 명령을 전혀 알지 못합니다. 더 쉬운 방법은 없지만 gedit에서 내 코드가 "명령을 찾을 수 없음"오류를주는 이유를 이해할 수 없습니다.Bash 변수 조작

내 코드 :

#!/bin/bash 
#Takes in a number and computes it into hailstone series while 
#displaying each number onto the screen 
echo Enter number: 
read n 

while [$n -gt 1] 
do 
if [$n % 2 -eq 0] 
    then 
    let n=n/2 
    echo $n 
else 
    let n=n*3+1 
    echo $n the number is header 
fi 
done 

내 변수가 문과 경우 처음 건너 뛰는 계속 돌아 수표 문 "헤더입니다"하고 나는 그것을 원하지 않는다. 내가 8을 입력하면 2-eq 0에 의해 수정되어야하므로 1 이하가 될 때까지 나누어야합니다.

+0

간격에주의하지 않아도됩니다. 명령어 이름이'['''$'''''''''''''''''''''''''''''''$' 또는 '[[''를 사용하여 간격을 덜어줍니다. 쉘 스크립팅은 공간에 많은주의가 필요합니다. –

+0

http://shellcheck.net/은 인간이 개입 할 필요없이 구문 버그를 찾는 당신의 친구입니다. –

+1

btw, 그것에 대해 생각하는 관점에서 :'[''** 명령 **, 언어 구문이 아닙니다. 'lsmydir' 대신에'ls mydir'을 실행하기 위해 두 단어를 사용해야 할 때와 마찬가지로, 쉘이'[foo'라는 다른 명령을 찾지 못하게하려면 [foo' 대신 [foo'를 실행해야합니다. 'test "는 다른 곳에서는 구문이 아닌 것처럼 보이는 것처럼'["$ n "-gt 1]'대신에'test"$ n "-gt 1"명령을 사용하면 혼란을 덜 일으킬 수 있습니다. –

답변

1

[ 이후와 ] 앞에 공백을 넣어야합니다. 따라서 while [$n -gt 1] 대신 while [ $n -gt 1 ]을 작성하십시오.

[$n % 2 -eq 0]도 마찬가지이지만 [ ... ]에는 % 연산자가 없으므로 그다지 도움이되지 않습니다. 대신 ((...))을 사용할 수 있습니다. 더 간단하고 직관적 인 ((...)) 구문을 사용하여 let 명령을 다시 작성했습니다.

#!/bin/bash 
echo Enter number: 
read -r n 

while ((n > 1)) 
do 
    if ((n % 2 == 0)) 
    then 
     ((n /= 2)) 
     echo $n 
    else 
     ((n = n * 3 + 1)) 
     echo $n the number is header 
    fi 
done 
+0

@Rep 나는 조금 더 나아졌습니다. – janos

+0

당신의 영혼을 축복하십시오. 모두에게 도움을 주셔서 감사합니다 07 – Rep