A parte 1 desta série, lembramos como implementar um:
E nos anteriores, nós nos embebemos no melhores práticas a seguir ao criar um excelente Script Shell no Bash para Linux, e muito especificamente em termos de concepção de um Shebang e um BSM (Modo Bash Strict / Modo Bash Estrito).
Melhores práticas para criar um Shell Script no GNU / Linux - Parte 1
Melhores práticas para criar um Shell Script no GNU / Linux - Parte 2
Neste post, veremos como implementar um Módulo de variáveis de ambiente para um script de shell no Bash para Linux, tomando como exemplo um dos meus programas (aplicativos) fatos em um Script shell chamado Linux Post Install - Bicentennial Script 8.0, mas primeiro um pequeno resumo do melhores práticas para que você os tenha em mente:
- Identifique seu código,
- Adicione espaços de separação entre as seções do código,
- Comente o máximo que puder sobre o código,
- Crie variáveis com nomes descritivos de suas funções,
- Use a sintaxe VARIABLE = $ (command) para a substituição do comando
- Use módulos e / ou variáveis de: Validação de Superusuário e Usuário Autorizado com ou sem senhas estabelecidas.
- Utilizar módulos e / ou variáveis de: Validação do Sistema Operacional (Distro, Versão, Arquitetura, entre outros.),
- Use módulos (procedimentos / seções) para confirmar a execução de ações críticas ou em lote (atividades / funções),
- Fornece interfaces amigáveis ao usuário (amigável ao usuário): Por terminal (com menus e cores usando diálogo) e / ou por desktop (com Windows usando Zenity e Gxmessage),
- Incluir módulos de Boas-vindas e Despedida (mensagens) ao usuário, se necessário,
- Inclui um módulo de verificação de dupla execução,
- Racionalize o tamanho do script com funções e / ou módulos externos,
- Invoque de forma clara e evidente as chamadas a outros Intérpretes,
- Aplique qualquer outra recomendação lógica e racional que você considere necessária.
Aqui está um exemplo de Módulo de variáveis de ambiente para um script de shell no Bash para Linux. Este deve ser o módulo (seção) que contém todas as variáveis certas ou prováveis que o Script shell necessidades ou necessitarão para sua execução. Eu pessoalmente adiciono o seguinte:
###############################################################################
# INICIO DEL MODULO DE VARIABLES DE ENTORNO DEL SCRIPT
###############################################################################
NOM_SCRIPT=lpi_sb8_inicio_2016.sh
# echo $NOM_SCRIPT
# Almacenar como una variable predeterminada el Nombre real del Script
USR1_VALID=sysadmin
# echo $USR1_VALID
# Almacenar como una variable predeterminada el Nombre de Usuario valido que podrá ejecutar el Script.
# Haga una variable por cada Usuario Autorizado.
PASSWD_VALID=lpi*sb8
# echo $PASSWD_VALID
# Almacenar como una variable predeterminada el Nombre de la contraseña valida que permitirá ejecutar el Script.
# Haga una variable por cada contraseña de cada Usuario Autorizado.
S_O_VALID=kali
# echo $S_O_VALID
# Almacenar como una variable predeterminada el tipo de Sistema operativo valido para donde debe ser ejecutado el Script.
HOST_VALID=hostmovil-sysadmin
# echo $HOST_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.
IP_VALID=192.168.1.107
# echo $IP_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.
MAC_VALID=44:8a:5b:f0:3d:f3
# echo $MAC_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.
FILE_LOCK=lpi_sb_file_lock.txt
# echo $FILE_LOCK
# Almacenar el nombre de archivo predeterminada por el sistema para evitar doble ejecuciones ó detectar ejecuciones fallidas.
IDSUPERUSER=$(id -u | awk '{print $1}')
# IDSUPERUSER=$(echo $UID)
# IDSUPERUSER=$(getent passwd $USER | cut -d: -f3)
# echo $IDSUPERUSER
# Almacenar IUD del Superusuario root
USER_NAME_1=$(cat /etc/passwd | grep 1000 | cut -d: -f1 | awk '{print $1}')
HOME_USER_NAME_1=/home/$USER_NAME_1
# echo $USER_NAME_1 $HOME_USER_NAME_1
# Almacenar el nombre del usuario 1000 y su /home. Probable unico y primer Usuario del Sistema.
USER_NAME_2=$(cat /etc/passwd | grep 1001 | cut -d: -f1 | sed -n '2p' | awk '{print $1}')
HOME_USER_NAME_2=/home/$USER_NAME_2
# echo $USER_NAME_2 $HOME_USER_NAME_2
# Almacenar el nombre del usuario 1001 y su /home. Probable segundo Usuario del Sistema.
ID_USERNAME_SESSION=$(for i in $(who | sed 1q | cut -c 1-8); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed 1q)
# echo $ID_USERNAME_SESSION
# Almacenar el ID del Nombre del primer usuario (alfabeticamente) detectado conectado (con sesión abierta) en el sistema.
USERNAME_ID_SESSION=$(for i in $(who | sed 1q | cut -c 1-8); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $2}' ; done ; echo $i)
# echo $USERNAME_ID_SESSION
# Almacenar el Nombre del primer usuario (alfabeticamente) detectado conectado (con sesión abierta) en el sistema.
# ID_FIRST_USERNAME=$(for i in 1000 1001 1002 1003 1004; do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed -n '1p')
# echo $ID_FIRST_USERNAME
# Almacenar el ID del Nombre del primer usuario creado en el sistema entre los ID del 1000 al 1005.
# Nota: Solo funciona con la opción -o desactivada del MODO BASH ESTRICTO ó SEGURO (Bash Strict Mode / BSM)
# ID_FIRST_USERNAME=$(for i in $(seq 1000 1999); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed -n '1p')
# echo $ID_FIRST_USERNAME
# Almacenar el ID del Nombre del primer usuario creado en el sistema.
# Nota: Solo funciona con la opción -o desactivada del MODO BASH ESTRICTO ó SEGURO (Bash Strict Mode / BSM)
UBICACION=$(echo $PWD)
# UBICACION=$(pwd)
# echo $UBICACION
# Almacenar ruta de ejecución del Script LPI-SB
FECHA_SISTEMA_AN=$(date +"%d %b %y")
# echo $FECHA_SISTEMA_AN
# Almacenar la fecha Alfanumerica actual del Equipo
FECHA_SISTEMA_N=$(date +"%d %m %y")
# echo $FECHA_SISTEMA_N
# Almacenar la fecha Numerica actual del Equipo
DIA_ACTUAL=$(date +"%d")
# echo $DIA_ACTUAL
# Almacenar el día actual del Equipo
MES_ACTUAL_A=$(date +"%b")
# echo $MES_ACTUAL_A
# Almacenar el mes alfabetico actual del Equipo
MES_ACTUAL_N=$(date +"%m")
# echo $MES_ACTUAL_N
# Almacenarel mes numerico actual del Equipo
ANO_ACTUAL_2C=$(date +"%y")
# echo $ANO_ACTUAL_2C
# Almacenar el año (con 2 cifras) actual del Equipo
ANO_ACTUAL_4C=$(date +"%Y")
# echo $ANO_ACTUAL_4C
# Almacenar el año (con 4 cifras) actual del Equipo
HORA_SISTEMA=$(date +"%H:%M")
# echo $HORA_SISTEMA
# Almacenar la Hora actual del Equipo
HORA_ACTUAL=$(date +"%H")
# echo $HORA_ACTUAL
# Almacenar la Hora actual del Equipo
MINUTOS_ACTUAL=$(date +"%M")
# echo $MINUTOS_ACTUAL
# Almacenar la Hora actual del Equipo
TIPO_S_O_L=$(uname -o)
# echo $TIPO_S_O_L
# Almacena el nombre largo del tipo de Sistema Operativo encontrado.
TIPO_S_O_C=$(uname -s)
# echo $TIPO_S_O_C
# Almacena el nombre corto del tipo de Sistema Operativo encontrado.
NOM_DISTRO_L=$(cat /etc/os-release | grep NAME | grep -v "VERSION" | sed -n '2p' | cut -f2 -d\")
# NOM_DISTRO_L=$(lsb_release -d | sed 's/Description://')
# echo $NOM_DISTRO_L
# Almacena el nombre largo de la Distro detectada.
NOM_DISTRO_C=$(cat /etc/os-release | grep NAME | grep -v "VERSION" | sed -n '2p' | cut -f2 -d\" | awk '{print $1}')
# NOM_DISTRO_C=$(lsb_release -d | sed 's/Description://' | awk '{print $1}')
# echo $NOM_DISTRO_C
# Almacena el nombre corto de la Distro detectada.
ID_DISTRO=$(cat /etc/os-release | grep ID | grep -v "VERSION_ID" | grep -v "ID_LIKE" | sed 's/ID=//' | sed 's/"//g')
# ID_DISTRO=$(lsb_release -i | awk '{print $3}')
# echo $ID_DISTRO
# Almacena el ID de la Distro detectada.
VER_DISTRO=$(cat /etc/os-release | grep VERSION= | sed -n '1p' | sed 's/VERSION=//' | sed 's/"//g')
# VER_DISTRO=$(lsb_release -c | sed 's/Codename://')
# echo $VER_DISTRO
# Almacena el nombre de la versión de la Distro detectada.
ID_VER_DISTRO=$(cat /etc/os-release | grep VERSION_ID= | sed -n '1p' | sed 's/VERSION_ID=//' | sed 's/"//g')
# ID_VER_DISTRO=$(lsb_release -r | sed 's/Release://')
# echo $ID_VER_DISTRO
# Almacena el ID de la versión de la Distro detectada.
ARQ_DISTRO_COD=$(uname -m)
# echo $ARQ_DISTRO_COD
# Almacenar el Tipo de Arquitectura de la Distro detectada en forma codificada.
ARQ_DISTRO_COD=$(uname -m) ; if [[ "$ARQ_DISTRO_COD" = "x86" ]]; then ARQ_DISTRO_HUM=32; else ARQ_DISTRO_HUM=64; fi
# echo $ARQ_DISTRO_HUM
# Convertir el Tipo de Arquitectura de la Distro detectada en forma codificada a forma humana.
VER_KERNEL=$(uname -r)
# echo $VER_KERNEL
# Almacenar el Nombre del Arquitectura de la Distro detectada.
NOM_HOST=$(cat /etc/hostname)
# echo $NOM_HOST
# Almacenar el Nombre del Host donde se ejecuta el Script.
IP_ETH0=$(ifconfig eth0 | grep inet | grep -v inet6 | cut -d ":" -f 2 | cut -d " " -f 1)
MAC_ETH0=$(ifconfig eth0 | sed -n '1p' | awk '{print $5}')
# IP_INTERNA=$(hostname -I)
# echo $IP_ETH0 $MAC_ETH0
# Almacenar la IP / MAC del Host donde se ejecuta el Script.
echo "Variables de entorno cargadas sin errores, en 5 segundos la aplicación continuará ejecutandose"
sleep 5
###############################################################################
# FINAL DEL MODULO DE VARIABLES DE ENTORNO DEL SCRIPT
###############################################################################
===============
Nota: Dependendo de seus requisitos ou implementações, você pode adicionar o comando command exportar minha_variavel abaixo de cada uma das variáveis anteriores criadas ou crie e exporte suas próprias variáveis criadas diretamente com o comando de comando export my_variable = my_parameters
Mais tarde, em postagens futuras, continuaremos a ver um exemplo de módulos (seções) que desempenham funções como:
- MÓDULO DE DETECÇÃO DE EXECUÇÃO DUPLA ou FALHA DE EXECUÇÃO
- MÓDULO DE OTIMIZAÇÃO
- MÓDULO DE AUTORIZAÇÃO DO USUÁRIO COM SENHA
- MÓDULO DE DETECÇÃO DA ARQUITETURA DO SISTEMA OPERACIONAL
- MÓDULO DE CONFIGURAÇÃO DE IDIOMA DE CODIFICAÇÃO
- MÓDULO DE CONFIGURAÇÃO PROXY PARA O AMBIENTE DE EXECUÇÃO
Entre muitos outros!
Eles podem se tornar autodidatas sobre os comandos: gksu, diálogo, gxmessage, zenity, espeak, play, entre muitos outros para criar interfaces gráficas por Terminal ou para a Área de Trabalho do Usuário, com alertas sonoros ou multimídia, e conhecimento avançado que usarão mais tarde.
Lembre-se de que estas e quaisquer outras recomendações sobre alguns módulo, função, variável, comando ou ação em geral pode ser realizado várias maneiras, e o que é mostrado aqui é apenas um maneira simples, Do muitas maneiras possíveis e prováveis em que disse a ação pode ou poderia ser realizada!
Só para terminar deixo-vos, um Screencast feito por mim, para mostrar o que você seria capaz de fazer, após completar este Curso online de script Shell em DesdeLinux:
(LINUX POST INSTALL - SCRIPT BICENTENNIAL 8.0.0) - Parte 2
Data para humanos:
echo -e «\ e [1; 32mData:» $ (data «+% d-% m-% Y») «\ e [1; 32m Tempo:» $ (data «+% T»)
Verdadeiro "uname -s":
cat / proc / sys / kernel / ostype
Nome da distro:
cat / etc / * release | corte -f2 -d »| cabeça -1
Nome de anfitrião:
cat / proc / sys / kernel / hostname
Arquitetura do sistema operacional:
[[-x / sbin / init]] && arquivo / sbin / init | awk '{print $ 7}' | tr -d ',' || [[-x / lib / systemd / systemd]] && arquivo / lib / systemd / systemd | awk '{print $ 7}' | tr -d ',' 2> / dev / null
Versão do kernel:
cat / proc / sys / kernel / osrelease
Gostei muito da sua primeira contribuição "data para humanos", pois o resultado seria um exemplo:
Data: 11/02/2016 Hora: 16:04:10
Que efetivamente em uma janela de diálogo, zenity ou gxmessage é muito digerível visualmente!
Com sua segunda sugestão, gostaria de colocá-lo assim:
se verdadeiro "uname -s" && cat / proc / sys / kernel / ostype; então echo "Sistema operacional validado"; fi | sede 1d
E, finalmente, muito obrigado por suas contribuições enriquecedoras como sempre!