<Anterior | Conteúdo | Próxima>
Uma aplicação mais completa
Após um longo hiato, retomaremos o trabalho em nosso sys_info_page programa. Nossa próxima adição irá adicionar várias opções de linha de comando ao programa da seguinte forma:
● Arquivo de saída. Adicionaremos uma opção para especificar um nome para um arquivo para conter a saída do programa. Será especificado como -f lima or --Arquivo lima.
● Modo interativo. Esta opção solicitará ao usuário um nome de arquivo de saída e determinará se o arquivo especificado já existe. Em caso afirmativo, o usuário será avisado antes que o arquivo existente seja sobrescrito. Esta opção será especificada por qualquer -i or --interativo.
● Ajuda. Ambas -h or --Socorro pode ser especificado para fazer com que o programa exiba uma mensagem informativa de uso.
Aqui está o código necessário para implementar o processamento da linha de comando:
uso () {
echo "$ PROGNAME: uso: $ PROGNAME [-f arquivo | -i]" return
}
# opções de linha de comando do processo interativo =
uso () {
echo "$ PROGNAME: uso: $ PROGNAME [-f arquivo | -i]" return
}
# opções de linha de comando do processo interativo =
nome do arquivo =
enquanto [[-n $ 1]]; caso $ 1 em
-f | --Arquivo)
mudança
nome do arquivo = $ 1
;;
nome do arquivo =
enquanto [[-n $ 1]]; caso $ 1 em
-f | --Arquivo)
-i | --interactive) interativo = 1
;;
-h | --help) saída de uso
;;
*) uso> & 2
sair 1
;;
-i | --interactive) interativo = 1
;;
-h | --help) saída de uso
;;
*) uso> & 2
sair 1
;;
esac
turno feito
esac
turno feito
Primeiro, adicionamos uma função shell chamada uso para exibir uma mensagem quando a opção de ajuda é chamada ou uma opção desconhecida é tentada.
A seguir, começamos o loop de processamento. Este loop continua enquanto o parâmetro posicional
$ 1 não está vazio. No final do loop, temos um comando shift para avançar os parâmetros posicionais para garantir que o loop acabe.
Dentro do loop, temos um casas instrução que examina o parâmetro posicional atual para ver se ele corresponde a qualquer uma das opções com suporte. Se um parâmetro compatível for encontrado, ele será acionado. Se uma escolha desconhecida for encontrada, a mensagem de uso será exibida e o script será encerrado com um erro.
A -f parâmetro é tratado de uma maneira interessante. Quando detectado, causa um mudança ocorrer, o que avança o parâmetro posicional $1 ao argumento do nome do arquivo fornecido ao -f opção.
A seguir, adicionamos o código para implementar o modo interativo:
# modo interativo
if [[-n $ interativo]]; então, embora seja verdade; Faz
ler -p "Digite o nome do arquivo de saída:" nome do arquivo if [[-e $ nome do arquivo]]; então
read -p "'$ filename' existe. Substituir? [y / n / q]>" case $ REPLY em
Y | y) pausa
# modo interativo
if [[-n $ interativo]]; então, embora seja verdade; Faz
ler -p "Digite o nome do arquivo de saída:" nome do arquivo if [[-e $ nome do arquivo]]; então
read -p "'$ filename' existe. Substituir? [y / n / q]>" case $ REPLY em
Y | y) pausa
;;
Q | q) echo "Programa encerrado." saída
;;
*) Prosseguir
;;
esac
elif [[-z $ filename]]; então continue
outro
quebrar
fi
feito
fi
;;
Q | q) echo "Programa encerrado." saída
;;
*) Prosseguir
;;
esac
elif [[-z $ filename]]; então continue
outro
quebrar
fi
feito
fi
Se o interativo variável não está vazia, um loop infinito é iniciado, que contém o prompt do nome do arquivo e o código de manipulação de arquivo existente subsequente. Se o arquivo de saída desejado já existir, o usuário é solicitado a sobrescrever, escolher outro nome de arquivo ou sair do programa. Se o usuário escolher sobrescrever um arquivo existente, um quebrar é executado para encerrar o loop. Observe como o casas instrução apenas detecta se o usuário escolhe sobrescrever ou sair. Qualquer outra escolha faz com que o loop continue e avisa o usuário novamente.
Para implementar o recurso de nome de arquivo de saída, devemos primeiro converter o código de escrita de página existente em uma função shell, por motivos que ficarão claros em um momento:
write_html_page () {cat << - _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
$ (report_uptime)
$ (report_disk_space)
$ (report_home_space)
_EOF_ retorno
}
# saída da página html
if [[-n $ filename]]; então
write_html_page () {cat << - _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
$ (report_uptime)
$ (report_disk_space)
$ (report_home_space)
_EOF_ retorno
}
# saída da página html
if [[-n $ filename]]; então
se tocar em $ filename && [[-f $ filename]]; então write_html_page> $ filename
outro
echo "$ PROGNAME: Não é possível gravar o arquivo '$ filename'"> & 2 exit 1
fi mais
write_html_page
fi
se tocar em $ filename && [[-f $ filename]]; então write_html_page> $ filename
outro
echo "$ PROGNAME: Não é possível gravar o arquivo '$ filename'"> & 2 exit 1
fi mais
write_html_page
fi
O código que lida com a lógica do -f opção aparece no final da lista mostrada acima. Nele, testamos a existência de um nome de arquivo e, se for encontrado, um teste é executado para ver se o arquivo é realmente gravável. Para fazer isso, um tocar é executado, seguido por um teste para determinar se o arquivo resultante é um arquivo normal. Esses dois testes cuidam de situações onde um nome de caminho inválido é inserido (tocar irá falhar) e, se o arquivo já existir, é um arquivo normal.
Como podemos ver, o write_html_page função é chamada para realizar a geração real da página. Sua saída é direcionada para a saída padrão (se a variável nome do arquivo está vazio) ou redirecionado para o arquivo especificado.