2013-12-12 6 views
0

내가 (15로 나누어 최소의 정수로 라운드 번호) 아주 간단한 프로그램을 실행하기 위해 노력하고있어하지만 오류를 얻고 경우에 오류가 발생합니다 함께 sh cache.sh호출 bash는 스크립트가 문 및 변수 할당

내가 배운 구문을 따라 갔다고 느낀다 here 그러나 나는 받고있다 line 9: syntax error: unexpected end of file 나는 무엇이 여기에서 잘못 되었 느냐?

+0

내가 배시 샘플을 볼 때 중요한 것은 * 모든 단일 문자 *가 중요하다는 것입니다. 특히 공간. 그리고 공간 부족. – Aesin

답변

0

스크립트에 구문 문제가 많습니다. 쉘 과제가에서 또한 =

주위에 공간이없는

VAR = '발'

대신

$ var에 = '발'

귀하의 올바른 스크립트가 될 수 있습니다 :

min=$(date +"%M") 

if ((min % 15 != 0)) 
then 
    echo "not fully divisible by 15" 
fi 

echo $min 
+0

고마워요.하지만 "오류 3 : 예상치 못한 토큰 근처에서 구문 오류가 발생했습니다." " – 1252748

+0

"bash./script.sh "로 실행하십시오. – anubhava

0

당신이 이것을 fr으로 변환 한 것 같습니다. om 다른 언어. 다음은 작동중인 bash 버전입니다.

#!/bin/bash 
min=$(date +"%M") 

if [ $(($min % 15)) != 0 ] ; then 
    min=$((min - min % 1)) 
fi 

echo $min; 

로컬 출력 :

~/tmp › sh ./test.sh 
34 
+0

예, 완전히 PHP heheh의 삼중 문자에서 왔습니다. 스 니펫에 "구문 오류 : 예기치 않은 파일 끝"오류가 표시됩니다. 그게 어떤 아이디어일까요?감사! – 1252748

+0

나는 문제없이 여기에서 그것을 달렸다. 어떤 OS/쉘을 사용하고 있습니까? – Donovan

+0

이 정보는 어떻게 찾을 수 있습니까? – 1252748

2

해당 스크립트가 유효 배시 구문 아니다. 먼저 몇 가지 작업 예제와 전체 자습서를 찾아 보겠습니다. 너는 available online 인 William Shotts의 책으로 시작할지도 모른다. 당신의 시도에 대한

일부 노트 :

  1. $

    는 그 값으로 변수 1의 교체를 요청하는 데 사용됩니다. 그것은 Perl이나 PHP에서와 같이 변수 이름의 일부인 sigil이 아닙니다. 따라서 과제의 왼쪽에는 사용되지 않습니다.

  2. 셸은 주로 다른 실행 파일을 실행하는 데 사용되며 해당 렌즈를 통해 모든 것을 해석합니다. 명령 행이 다른 프로그램을 호출하는 것처럼 보이면 쉘은 쉘 스크립트가 아닌 다른 프로그램을 실행하려고 시도합니다. 따라서 min = date +"%M" 명령을 실행하면 셸에서 min이라는 프로그램을 찾고 세 개의 명령 줄 인수 인 =, date+%M으로 실행합니다.
    할당이 이와 같이 인식되도록하려면 = 주위에 공백이 없어야합니다.

  3. 공백이 없으면 min=date +"%M"은 여전히 ​​적합하지 않습니다. 쉘은 리터럴 문자열 "date"를 변수 min에 일시적으로 할당 한 다음 +%M이라는 명령을 실행하려고 시도합니다.
    값에 공백이있는 경우 사이에 따옴표가 필요합니다.

  4. 그러나 인용 부호를 사용해도 min="date +%M"min에 "date + % M"이라는 리터럴 문자열을 할당합니다. 실제로 을 실행하려면date +"%M"을 실행하고 출력을 값으로 사용하려면 명령 대체 구문 $(...)을 사용하여 출력을 요청해야합니다. 여기 우리의 친구 인 달러 기호는 다시 동적 값으로 대체를 요청하지만 괄호는 다른 유형의 요청으로 만듭니다. 변수의 값 대신 표현식이 명령의 출력으로 대체됩니다.

  5. 위에서 언급 한 구문 분석 문제로 인해 기본 제공 산술 연산은 특정 상황에서만 작동합니다. 유효한 산술 문맥을 생성하는 두 가지 방법은 (( ... )) 특수 서식과명령입니다.

  6. 마지막으로 스크립트가 구문 상 유효하더라도 가장 가까운 15의 배수로 반올림하는 것은 의미 상 올바르지 않습니다. 1로 나눈 나머지는 항상 0이므로 스크립트는 min에서 0을 뺀 다음 결과가 아무 것도 표시되지 않습니다. min에 할당이 없기 때문입니다. 반올림하기를 원한다면 방금 테스트 한 나머지 부분을 실제로 빼야합니다. 이처럼 할 수있는 :

    min=$(date +%M) 
    let rem=min%15 
    if ((rem != 0)); then 
        let min-=rem 
    fi 
    echo $min 
    

하지만 당신은 좀 더 간결하게 그것을 할도 수 : 0 감산 무해하기 때문에

echo $((min=$(date +%M), min-=min%15)) 

이는 if없이 작동합니다. 쉼표를 사용하면 두 표현식을 ((...))의 단일 세트 안에 넣을 수 있습니다. 두번째 표현 min-=min%15은 수정 과제입니다. 이것은 min=min-min%15과 같은 것을 의미하지만, "min"을 타이핑하는 하나의 인스턴스를 저장합니다. 친구 교체 요청을 $ 앞에두고 (( ... ))을 입력하면 전체 표현식이 해당 값으로 바뀌므로 echo이 출력됩니다. 표현식 목록의 값은 마지막 표현식의 값이며 할당 값은 할당 된 값과 같으므로 echo ed 결과는 최종 값 $min과 같습니다. 가장 가까운 값은 시간당 15 분의 배수.

셸 용어에서 변수는 실제로 "매개 변수"라고합니다. 문서를 읽을 때 염두에 두어야 할 것이 있습니다.

2 당신은 실제로 이런 이유로 명령에 %M 주위에 따옴표가 필요하지 않습니다. 셸의 모든 것은 자동으로 문자열입니다. 그것을 만들기 위해 따옴표가 필요하지 않습니다. 그러나 그것은 상처를주지 않으며, 물건 주위에 인용 부호를 두는 것은 좋은 습관입니다. 왜냐하면 입력 값에서 예기치 않은 특수 문자로 인해 코드가 손상되지 않도록하기 때문입니다.

+0

정말 고마워요, 이것은 정말 많은 정보입니다. 첫 번째 코드 스 니펫에서 "행 6 : 구문 오류 : 예기치 않은 파일 끝"오류가 발생합니다. 두 번째 예제에서 어떤 일이 발생 하는지를 실제로 이해하지는 못하지만 값을 반환하지는 않습니다. – 1252748

+0

@thomas 방금 두 개의 예제가 여기에서 내 터미널 창으로 복사하여 붙여 넣어서 작동한다는 것을 확인했습니다. 그래도 약간 수정 했으니 다시 확인해주세요. –

0
min=`date +"%M"`; 

if [ $min%15 != 0 ] 

then 

min=$((min - min%1)) 

fi 

echo $min;