쉘 스크립트 연산식 질문드립니다 (내용 간단해요!)

kungfumong의 이미지

allday=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400); 
if(i==1 && ((year%4==0 && year%100 !=0) || year%400==0))

allday=`expr (($year-1)+($year-1)/4-($year-1)/100+($year-1)/400)`
if [ $i -eq 1 -a (`expr ($year % 4 -eq 0 -a $year % 100 -ne 0)` || `expr $year % 400 -eq 0))` ]

위에가 원래 수식이고

아래가 제가 작성한 쉘스크립트 소스입니다.
에러가 나는데 뭐가 틀린지 모르겠네요...
쉘 스크립트 연산식 쓰는거 정말 불편한데 변환기 이런건 없을까요?

김정균의 이미지

일단, if 문은 에러가 나겠네요. 비교문에서 "||"를 사용하려면 독립된 bracket을 사용해야 합니다. 아니면 "-o" 옵션을 사용하든지요. 그리고 backtick operator와 괄호 묶음도 잘못 되어 있네요.

예를 들면

if [ $i -eq 1 -a `expr ($year % 4)` -eq 0 -a `expr ($year % 100)` -ne 0 -o `expr $year % 400` -eq 0 ]

또는

if [ $i -eq 1 ] && [ `expr ($year % 4)` -eq 0 ] && [ `expr ($year % 100)` -ne 0 ] || [ `expr $year % 400` -eq 0 ]

와 같이 되어야 합니다. 또는 C 처럼 사용하려면 [] 대신에 (())를 이용할 수 있습니다.

if (( $i == 1 && (`expr ($year % 4)` == 0 && `expr ($year % 100)` != 0) || `expr $year % 400` == 0 ))

bash에서 수식 연산은 $(( ... )) 또는 $[ .. ] 를 이용하시면 됩니다.
그리고 비교문을 C 처럼 사용하려면 [] 대신 (())를 사용하실 수 있습니다.

allday=$[ (year-1)+(year-1)/4-(year-1)/100+(year-1)/400 ]
if (( $i == 1 && ($(($year % 4)) == 0 && $(($year % 100)) != 0) || $(($year % 400)) == 0 ))

위의 설명은 일단 bash 4 기준으로 설명을 드린 것입니다.

bash 문법 자체에 어려움이 있으신 것 같은데, 기본적으로 프로그래밍이 가능하시니, https://mug896.gitbooks.io/shell-script/content/ 문서 전체를 한번 읽어 보시는 것을 권장 드립니다. 그리 긴 문서는 아니니 한번 읽어 보시고 스크립트를 작성하시는 것이 훨씬 진도가 빠를 듯 싶습니다. :-)

kungfumong의 이미지

day=0 mon=0 year=0
reamin=0
a=("일" "월" "화" "수" "목" "금" "토" )
month=(31 28 31 30 31 30 31 31 30 31 30 31)
echo -n "year : "
read year
echo -n "mon  : " 
read mon
 
allday=$[ (year-1)+(year-1)/4-(year-1)/100+(year-1)/400 ]
i=0
for ((i=0; i < $mon; i++)); do
if (( $i == 1 && `expr ($year % 4)` == 0 && `expr ($year % 100)` != 0 || `expr $year % 400` == 0 ))
    then
        $month[1]=`expr $month  + 1`
    fi
    $allday=`expr $allday + 1`
done
$allday=`expr $allday - $month[$i]`
remain=`expr ($allday + 1) % 7`
$i=`expr ($remain + day - 1) % 7`
 
c=0
d=0
count=1
 
echo -n "  일  월  화  수  목  금  토"
for ((c=0; c<6; c++)); do
    for ((d=0; d<7; d++)); do
            if [ $i -eq 0 -a $d -lt $reamin ]
            then
                echo "    "
                continue
            elif [ `expr $count -ge $month[mon-1] + 1` ]
                break
            fi
            echo "    "
            echo $count 
    done
    echo -n ""
done

알려주신대로 수정했는데
27, 35, 39, 43 , 73 번 행에서 에러가 나네요
27,35행이면 알려주신 연산식인데 뭐가 잘못된걸까요 ㅠ

김정균의 이미지

일단, 34라인

elif [ `expr $count -ge $month[mon-1] + 1` ]

가 문법 에러 입니다. expr은 수식인데, 수식 안에서 "-ge"로 비교를 하고 있으니 에러지요.

elif [ $count -ge `expr $month[$mon-1] + 1` ]; then

이렇게 되어야 겠지요. 그리고 비교문 뒤에 'then' 키워드도 빠졌고요.

그리고 기본적으로 문법 오류가 너무 많습니다.

예를 들어

$allday=`expr $allday - $month[$i]`

이런 것들..

allday=`expr $allday - $month[$i]`

이렇게 되어야 하죠. 좀 고쳐 보려다 오류가 너무 많아서 .. :-)

제가 읽어 보라고 한 문서를 한번 정독 해 주시고 다시 작성 하시는 것이 도움이 될 듯 싶습니다.

kungfumong의 이미지

감사합니다! 많은 도움이 되었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.