Script do Solaris Bash se comando de condição + armazenar na variável?

0

Eu estou tentando fazer duas funções no bash. Uma função que percorre o conteúdo de um diretório e faz um hash md5 para cada arquivo, armazenando-os em um arquivo de soma de verificação .md5 no mesmo diretório. A outra função para verificar esse arquivo de soma de verificação em relação ao conteúdo do diretório. Estou tentando manter o padrão de arquivo .md5 que, acredito, é o md5 hash seguido pelo nome do arquivo em uma linha para cada arquivo.

Requisitos: Eu só posso usar o comando digest para criar o hash; quais erros nos diretórios ...

Idealmente, posso supor que os arquivos de entrada para arquivar são n número de itens que não são de diretório. No entanto, eu quero ser capaz de verificar o resumo primeiro por erros. Mesmo se falhar por alguma razão desconhecida, posso fazer outra tentativa antes de sair do script inteiro com erros, ou pelo menos registrar a incapacidade de fazer um resumo para esse arquivo em particular e continuar.

Pergunta principal: Como posso verificar se um erro de condição verifica um comando e também armazena a saída em uma variável?

Atualização: Solução aqui

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

Eu tentei outras variantes, como piping para um arquivo temporário, obtendo a variável e, em seguida, removendo o arquivo temporário, mas isso era excessivo para essa tarefa. Eu também olhei para acessar o código de saída usando $? mas com base no que eu li no passado, eu não tenho certeza da solidariedade desta comunidade em relação ao seu uso, deixe-me saber o que você pensa.

Pergunta secundária: Existe uma maneira melhor de conseguir isso?

Abaixo estão minhas funções incompletas atuais. Obrigado!

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
    
por JaredTS486 20.11.2015 / 19:32

0 respostas