조건부 명령 + 변수에 저장된 경우 Solaris Bash 스크립트?

조건부 명령 + 변수에 저장된 경우 Solaris Bash 스크립트?

Bash에서 두 가지 기능을 만들려고합니다. 함수는 디렉터리의 내용을 반복하여 각 파일에 대한 md5 해시를 생성하고 이를 동일한 디렉터리의 .md5 체크섬 파일에 저장합니다. 또 다른 기능은 디렉토리 내용에 대해 체크섬 파일을 확인하는 데 사용됩니다. 나는 계속 노력하고있다.md5 파일 표준나는 그것이 md5 해시 뒤에 각 파일에 대한 한 줄의 파일 이름이 오는 것이라고 생각합니다.

요구 사항: 해시를 생성하려면 다이제스트 명령만 사용할 수 있습니다. 디렉토리에 무슨 문제가 있습니까?

이상적으로는 보관할 인바운드 파일이 디렉터리가 아닌 n개의 항목이라고 가정할 수 있습니다. 그래도 먼저 요약해서 오류를 확인할 수 있었으면 좋겠습니다. 알 수 없는 이유로 실패하더라도 오류로 인해 전체 스크립트를 종료하기 전에 다시 시도하거나 최소한 해당 특정 파일에 대해 다이제스트할 수 없음을 기록하고 계속할 수 있습니다.

주요 질문: 조건이 잘못된 경우 어떻게 명령을 확인하고 출력을 변수에 저장할 수 있습니까?

고쳐 쓰다:해결책은 여기에 있습니다

if ! digest -a md5 "$file" ; then ; fi

변수를 가져오기 위해 임시 파일로 파이핑한 다음 임시 파일을 삭제하는 등의 다른 변형을 시도했지만 이 작업에는 너무 과도한 것 같습니다. 또한 종료 코드에 액세스하기 위해 $?를 사용해 보았지만 과거에 읽은 내용에 따르면 커뮤니티가 이 코드 사용에 대해 얼마나 단합되어 있는지 잘 모르겠습니다. 귀하의 생각을 알려주십시오.

두 번째 질문: 이를 달성하는 더 좋은 방법이 있습니까?

다음은 현재 불완전한 기능입니다. 감사해요!

function make_directory_md5 () {
    local md5_file=$"$1/$(basename $1).md5"
    local attempts=$(($2 - 1))
    if [ ! -f "$md5_file" ] ; then
        if ! touch "$md5_file" >> "$file_log" ; then
            warning_handle "Could not make checksum file $md5_file, continuing anyway..."
            if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
        else
            if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file created..." ; fi
            #Loop through file contents and get md5 and filename and output to checksum file
            for file in "$1/*" ; do
                if [ ! -d "$file" ] ; then
                    if [ ! "$file" = "$md5_file" ] ; then #Skip md5 file.
                        if ! hash="$(digest -a md5 $file)" >> "$file_log"  ; then
                            warning_handle "Problem occured when attempting to digest $file"
                            if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
                            if [ $attempts -ge 1 ]; then
                                make_directory_md5 $1 $attempts
                            else
                                warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                                local sucess=false
                                if ! rm "$md5_file" >> "$file_log" ; then
                                    if [ -f "$md5_file" ] ; then
                                        warning_handle "Could not remove $md5_file and it still exists!"
                                    fi
                                else
                                    if [ "$verbose_mode" = true ]; then verbose_handle "Removed $md5_file" ; fi
                                fi
                            fi
                        else
                            echo "$hash $file" >> "$md5_file"
                        fi
                    fi
                else
                    warning_handle "Cannot hash directory! Skipping $file"
                    #Recursive decent into new directory. Or assume no directories ever...
                fi
            done
        fi
    else
        warning_handle "Attempted to create checksum file $md5_file but it already exists..."
        if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to remove $md5_file..." ; fi
        if ! rm "$md5_file" >> "$file_log" ; then
            if [ -f "$md5_file" ] ; then
                warning_handle "Could not remove $md5_file and it still exists. Continuing with backup..."
                if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
            else
                if [ "$verbose_mode" = true ]; then verbose_handle "Old checksum file $md5_file removed..." ; fi
                if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
                if [ $attempts -ge 1 ] ; then
                    make_directory_md5 $1 $attempts
                else
                    local sucess=false
                    warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                    if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
                fi
            fi
        else
            if [ "$verbose_mode" = true ]; then verbose_handle "Old checksum file $md5_file removed..." ; fi
            if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
            if [ $attempts -ge 1 ] ; then
                make_directory_md5 $1 $attempts
            else
                local sucess=false
                warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
            fi
        fi
    fi
}

function check_directory_md5 () {
    local md5_file=$"$1/$1.md5"
    for file in "$1"/. ; do
        echo "$file"
    done
}

make_directory_md5 "/home/jsharpe/out" 3

관련 정보