2012-06-05 3 views
2

질문 아래 코드.쉘 스크립트에서 조건에 md5 해시 값을 비교하는 방법은 무엇입니까?

#!/bin/sh 

check() { 
    dir="$1" 
    chsum1=`find ~/folder -type f -exec cat {} \; | md5` 
    chsum2=$chsum1 

    for ((; 0x$chsum1 == 0x$chsum2; )) 
    do 
     echo "hello" 
     sleep 10 
     chsum2=`find ~/folder -type f -exec cat {} \; | md5` 
    done 

echo "hello" 
#eval $2 
} 

check $* 

목표는 다음과 같습니다. 코드 작성. 그것은 무엇입니까? md5를 폴더에 적용한 다음 md5 값을 비교합니다. 그것은 값이 달라질 때까지 루프를 유지합니다 (즉, 폴더상의 어떤 일이 일어 났음을 의미합니다). 따라서 md5가 해시를 계산할 때 10 초 후에 코드가 다르게되어야합니다.

두 가지 질문.

  1. 거기에 댓글이 있습니다. 주석 처리를 제거하고 for에 대해 주석을 달면 코드가 작동을 멈춘다는 것을 알 수 있습니다. 왜? 내가 그것을 작동 시키려고 노력에 대한 다른 조합을 시도. 따옴표로 묶고, -eq, =, == 등을 사용했습니다. 아무 것도 작동하지 않았습니다. 나는 어떻게 그것을 전체와 함께 작동시킬 수 있을까?
  2. 그 다음 실행되는 경우는, 지금 코드가 내가 출력으로 무엇을 얻을 방법은 다음과 같습니다

((: d41d8cd98f00b204e9800998ecf8427e의 == 97329acaae00bdf66e30ac53b49e1036 : 값이 기본에 너무 큰 (오류 토큰 "입니다 97329acaae00bdf66e30ac53b49e1036 ")

Thus, how can I fix this is the second question and why this is happening. 

감사합니다!

+0

pastebin의 링크가 끊어졌습니다. 코드를 다른 사이트에 게시하는 대신 질문에 붙여 넣으십시오. – mttrb

+0

글을 올리려고했지만 여기에 질문의 서식을 지정하는 데 어려움이 있습니다. 나는 그것을 사과한다. –

+0

pastebin에서 코드를 복사 했으므로 수정 사항을 수락해야합니다. 기본적으로, 코드를 붙여넣고 그것을 선택하고 텍스트 상자 위의'{}'버튼을 눌러 코드로 형식을 지정하십시오. – mttrb

답변

2

당신은() 업데이트 게시 코드로 발생하는 문제를 while 루프가 작동 할 때 for 루프를 사용하고 있다는 것입니다.

다음 코드는 저에게 적합합니다. 나는 간단히 for 루프를 while 루프로 바 꾸었습니다.

#!/bin/sh 

check() { 
     dir="$1" 
     chsum1=`find ~/NASAtest -type f -exec cat {} \; | md5` 
     chsum2=$chsum1 

     while [ $chsum1 == $chsum2 ] 
     do 
       echo "hello" 
       sleep 10 
       chsum2=`find ~/NASAtest -type f -exec cat {} \; | md5` 
     done 

     echo "hello" 
     #eval $2 
} 

check $* 

while 루프가 작동하지 않는 이유는 대괄호와 표현식 사이에 공백이 없기 때문입니다.

+0

안녕하세요, 제 질문에 대한 설명이 잘못 표시되어서 죄송합니다. 나는 그것을 업데이트했다, 당신은 당신의 대답을 편집 해 주시겠습니까? 나는 그것을 사과한다. –

+0

나는 당신이 무엇을 요구하고 있는지 전혀 모른다. 아마도 일부 코드에 링크를 추가하는 것보다 명확하게하기 위해 질문을 다시 작성해야합니다. – mttrb

+0

나는 코멘트를 게시하기 전에 그것을 확인했다. 코드에 대한 링크는 이미 paste bin에 있습니다! –

0

[$의 chsum1 == $의 chsum2 일부 물건이 같이 할 필요가

종료 수행 할 때

while [ $chsum1 == $chsum2 ] 
do 
(perform some stuff) 
done 

참고 대괄호 주위 공간 (줄 바꿈 포함)에게 end 대신 do/done 블록을 사용해야합니다.

+0

안녕하세요, 나는 내 질문에 대한 설명이 오도했다. 나는 그것을 업데이트했다, 당신은 당신의 대답을 편집 해 주시겠습니까? 나는 그것을 사과한다. –

+0

while 루프 문제는 대괄호와 실제 테스트 사이에 공백이 있어야한다는 것입니다. –

+0

오해의 소지가 있기 때문에 질문에서 코드를 삭제했습니다. 문제의 코드는 링크에있는 코드입니다. 죄송합니다. –

1

값 앞에 Z를 넣고 문자열로 비교하면 비교할 변수의 형식이나 유형에 대한 혼란을 피할 수 있습니다 (기준에 비해 너무 큰 값).

# read or operation to define $file1 & $file2 here ... 
    val1=`md5sum ${file1} | awk '{print $1}'` 
    val2=`md5sum ${file2} | awk '{print $1}'` 
    tmpval="Z${val1}" ; val1="${tmpval}" 
    tmpval="Z${val2}" ; val2="${tmpval}" 
    if [[ "$val1" -eq "$val2" ]] ; then 
    # files are the same, do operation here .. 
    fi 
done 
관련 문제