Navaja suiza del programador en shell (Bash)

Aqui describiremos las opciones mas usadas del shell bash, que sera de mucha utilizada como referencia al programador:

Operadores del Shell

Operadores Aritméticos Operadores Relacionales
+ Adicion == Igual
- Restar != Diferente
* Multiplicacion > Mayor
/ Division >= Mayor o igual
% Modulo < Menor
** Exponente <= Menor ou Igual

Operadores de asignacion Operadores de BIT
= Asignar valor a una variable « Desplazamiento a la izquierda
+= Incrementar a la variable una constante » Desplazamiento a la derecha
-= Restar una varible por una constante & Y del bit (AND)
*= Multiplica una variable por una constante | O del bit (OR)
/= Divide una variable por una constante ^ O exclusivo del bit (XOR)
%= Resto de la division por una constante ~ Negacion del bit
++ Incremente en 1 la variable ! No del bit(NOT)
– Decremente en 1 la variable

Operadores Lógicos Operadores de BIT (asignacion)
&& Y lógico (AND) <<= Desplazamiento a la izquierda
|| O lógico (OR) >>= Desplazamiento a la derecha
&= Y de bit
|= O de bit
^= O exclusivo de bit

Redireccionamiento

Operador Accion
< Redirecionamiento de la entrada estandar (STDIN)
> Redirecionamiento de la salida estandar (STDOUT)
2> Redireccionamiento de la salida de errores (STDERR)
>> Redirecionamiento de la salida estandar, adicionando
2>> Redirecionamiento de la salida de errores, adicionando
| Conectar la salida estandar con una entrada estadar de otro comando
2>&1 Conectar la salida de errores a la salida estandar
>&2 Conectar la salida estandar a la salida de errores
>&- Cierra la salida estandar
2>&- Cierra la salida de errores
3<>arq Conecta el descriptor de archivos 3 al archivo ‘arq’
<<FIM Alimenta la entrada estandar
<<-FIM Alimenta la entrada estandar, cortando TABs
<(cmd) La salida del comando ‘cmd’ es un archivo: diff <(cmd1) <(cmd2)
>(cmd) La entrada del comando ‘cmd’ es um archivo: tar cf >(bzip2 -c >file.tbz) $dir

Variables especiales

Variable Posicion de los paramentros
$0 Parametro número 0 (nombre del comando o funcion)
$1 Parametro número 1 (de la linea de comando o funcion)
... Parametro número N ...
$9 Parametro número 9 (de la linea de comando o funcion)
${10} Parametro número 10 (de la linea de comandos o funcion)
... Parametro número NN ...
$# Número total de parametros de la linea de comando o funcion
$* Todos los parametros, como una cadena unica
$@ Todos los parametros, como varias cadenas protegidas

Variable Miscelanea
$$ Número PID del proceso actual (del propio script)
$! Número PID del último trabajo en segundo plano
$_ Último argumento del ultimo comando ejecutado
$? Código de retorno del ultimo comando ejecutado

Extension de variables

Sintaxis Extension Condionalpansão Condicional
${var:-texto} Si var no esta definida, retorna ‘texto’
${var:=texto} Si var no esta definida, la define como ‘texto’
${var:?texto} Si var no esta definida, retorna el error error ‘texto’
${var:+texto} Si var no esta definida, retorna ‘texto’, Si no retorna vacio

Sintaxis Extension de Strings
${var} Es lo mismo que $var, pero no ambiguo
${#var} Retorna el tamaño de la cadena
${!var} Ejecuta el contenido de $var (igual ‘eval \$$var’)
${!texto*} Retorna los nombre de las variables que empiezan con ‘texto’
${var:N} Retorna el texto a partir de la posicion ‘N’
${var:N:tam} Retorna ‘tam’ caracteres a partir de la posicion ‘N’
${var#texto} Corta ‘texto’ del inicio de la cadena
${var%texto} Corta ‘texto’ del final de la cadena
${var/texto/nuevo} Reemplaza ‘texto’ por ‘nuevo’, una vez
${var//texto/nuevo} Reemplaza ‘texto’ por ‘nuevo’, siempre
${var/#texto/nuevo} Si una cadena comienza con ‘texto’, reemplaza ‘texto’ por ‘nuevo’
${var/%texto/nuevo} Si una cadena termina con ‘texto’, reemplaza ‘texto’ por ‘nuevo’

Bloques y agrupamiento

Sintaxis Descripcion Ejemplo
“...” Protege una cadena, mas reconoce $, \ y ` como especiales “abc”
‘...’ Protege una cadena completamente (sin caracteres especiales) ‘abc’
$’...’ Protege una cadena completamente, mas interpreta \n, \t, \a, etc ‘abc\n’
`...` Ejecuta comandos en una subshell `ls`
{...} Agrupa comandos en un bloque { ls ; }
(...) Ejecuta comandos en una subshell ( ls )
$(...) Ejecuta comandos en una subshell, retornando el resultado $( ls )
((...)) Prueba una operacion aritmética, retornando 0 o 1 ((5 > 3))
$((...)) Retorna el resultado de una operacion aritmética $((5+3))
[...] Prueba una expresion, retornando 0 o 1 (alias do comando ‘test’) [ 5 -gt 3 ]
[[...]] Prueba una expresion, retornando 0 o 1 (pudiendo usar && e ||) [[ 5 > 3 ]]

If, For, Select, While, Until, Case

IF

if CONDICION
then
comandos
elif CONDICION
comandos
else
comandos
fi

FOR/SELECT

for VAR in LISTA
do
comandos
done
 
o:
 
for ((exp1;exp2;exp3))

WHILE / UNTIL

while CONDICION
do
comandos
done

CASE

case $VAR in
txt1) comandos;;
txt2) comandos;;
txtN) comandos;;
*) comandos;;
esac

Opciones del Comandos 'test' o '['

Pruebas en archivos Pruebas en variables
-b es un dispositivo de bloque
-c es un dispositivo de caracter Comparacion Numerica
-d es un directorio -lt es menor que (LessThan)
-e el archivo existe -gt es mayor que (GreaterThan)
-f es un archivo normal -le es menor igual (LessEqual)
-g el bit SGID está ativado -ge es mayor igual (GreaterEqual)
-G el grupo de archivo es del usuario actual -eq es igual (EQual)
-k el sticky-bit está ativado -ne es diferente (NotEqual)
-L el archivo es un enlace simbólico
-O el propietario del archivo es el usuario actual Comparacion de Cadenas
-p el archivo es un llamamo pipe = es igual
-r el archivo tiene permiso de lectura != es diferente
-s el tamaño del archivo es mayor que cero -n no es nulo
-S el archivo es un socket -z es nulo
-t el descritor de archivos N es una terminal
-u el bit SUID está ativado Operadores Lógicos
-w el archivo tiene permiso de escritura ! No lógico (NOT)
-x el archivo tiene permiso de ejecucion -a Y lógico (AND)
-nt el archivo es el mas reciente (NewerThan) -o O lógico (OR)
-ot el archivo es el mas antiguo antigo (OlderThan)
-ef el archivo el el mismo (EqualFile)

Caracteres de Escape Especiales para Usar en el Prompt (PS1)

Escape Mnemónico Extension para...
\a Alerta Alerta (bip)
\d Fecha Fecha con formato “Dia-de-semana Mes Dia” (Sat Jan 15)
\e Escape Caractere Esc
\h Hostname Nombre de la máquina sim el dominio (dhcp11)
\H Hostname Nombre completo de la máquina (dhcp11.empresa)
\j Jobs Número de jobs ativos
\l Tty Nombre de la terminal actual (tty1)
\n Newline Linea nueva
\r Return Retorno de carro
\s Shell Nombre del shell (basename $0)
\t Time Horario en formato 24 horas HH:MM:SS
\T Time Horario en formato 12 horas HH:MM:SS
\@ At Horario en formato 12 horas HH:MM am/pm
\A At Horario en formato 24 horas HH:MM
\u Usuário Login del usuario actual
\v Version Version del Bash
\V Version Version+subversion de Bash (2.00.0)
\w Working Dir Directorio actual, ruta completa ($PWD)
\W Working Dir Directorio actual, solamente el ultimo (basename $PWD)
\! History Número del comando actual en el histórico
\# Número Número del comando actual
\$ ID Muestra “#” si es para root, “$” si es para usuario normal
\nnn Octal Caracter cuyo octal es nnn
\\ Backslash Barra invertida \ literal
\[ Escapes Inicia una secuencia de escapes (tipo códigos de colores)
\] Escapes Termina una secuencia de escapes

Escapes reconocidos para comando 'echo'

Escape Mnemonico Descripcion
\a Alerta Alerta (bip)
\b Backspace Caracter Backspace
\c EOS Termina la cadena
\e Escape Caracter Esc
\f Form feed Alimentacion
\n Newline Linea nueva
\r Return Retorno de carro
\t Tab Tabulacion horizontal
\v Vtab Tabulacion vertical
\\ Backslash Barra invertida \ literal
\nnn Octal Caracter cuyo octal es nnn
\xnn Hexa Caracter cuyo hexadecimal es nn

Formateadores del comando 'date'

Formato Descripcion
%a nombre del dia de la semana abreviado (Dom..Sáb)
%A nombre del dia de la semana (Domingo..Sábado)
%b nombre del mes abreviado (Jan..Dec)
%B nombre del mes (January..December)
%c fecha completa (Sat Nov 04 12:02:33 EST 1989)
%y año (00..99)
%Y año (1970...)
%m mes (01..12)
%d dia (01..31)
%j dia del año (001..366)
%H horas (00..23)
%M minutos (00..59)
%S segundos (00..60)
%s segundos desde 1º de enero de 1970
%% un % literal
%t un TAB
%n se rompe la linea

Formateadores del comando 'printf'

Formato Descripcion
%d Número decimal
%o Número octal
%x Número hexadecimal (a-f)
%X Número hexadecimal (A-F)
%f Número con punto flotante
%e Número en notacion científica (e+1)
%E Número en notacion científica (E+1)
%s String

Letras de Identificadores de Archivos del Comando 'ls -l'

Letra Mnemonico Tipos de Archivo (primer caracter)
- - archivo normal
d Directory diretorio
l Link enlace simbólico
b Block dispositivo de bloque (HD)
c Char dispositivo de caracteres (modem serial)
s Socket socket mapeado en un archivo (comunicacion de procesos)
p Pipe FIFO o llamado Pipe (comunicacion de procesos)

Letra Mnemonico Permisos del Archivo (proximos nueve caracteres)
- - permiso desactivado
r Read aceso de lectura
w Write aceso de escritura
x eXecute aceso de ejecucion (o aceso al directorio)
X eXecute acesso al diretório solamente
s Set ID usuario/grupo para ejecucion (SUID, SGID) - permiso ‘x’ activado
S Set ID usuario/grupo para ejecucion (SUID, SGID) - permiso ‘x’ desativado
t sTicky usuarios borran solamente sus propios archivos - permiso ‘x’ ativado
T sTicky usuarios borran solamente sus propios archivos - permiso ‘x’ desativado

Comodines para nombres de archivos

Comodin Relacionado con... Ejemplo
* Cualquier cosa *.txt
? Un caracter cualquiera archivo-??.zip
[...] Cualquier de los dos caracteres listados [Aa]rquivo.txt
[^...] Cualquiera del primer caracter, excepto lo mencionandos [^A-Z]*.txt
{...} Cualquiera de los dos textos separados por coma archivo.{txt,html}

Comodines para los Items del comando 'case'

Comodin Relacionado con... Ejemplo
* Cualquier cosa *.txt) echo ;;
? Un caracter cualquiera archivo-??.zip) echo ;;
[...] Cualquier de los dos caracteres listados [0-9]) echo ;;
[^...] Cualquiera del primer caracter, excepto los listados [^0-9]) echo ;;
...|... Cualquiera de los dos textos separados por | txt|html) echo ;;

Códigos de Retorno de Comandos

Código Significado Ejemplo
0 Ningun error, la ejecucion termino OK echo
1 La mayoria de los errores comunes en la ejecucion echo $((1/0))
2 Error de uso en algun ‘builtin’ del Shell -
126 Comando no ejecutable (sin permiso) touch a ; ./a
127 Comando no encontrado (”command not found”) echooo
128 El parametro para el ‘exit’ no es un decimal exit 1.0
128+n 128 + código de señal que lo mato kill -9 $PPID #exit 137
130 El programa interrumpido con Ctrl+C (128 + 2) -
255* Parametro para el ‘exit’ no esta entre 0 e 255 exit -1

Códigos de Colores (ANSI)

Color Letra Fondo ___ Atributo Valor ___ Ejemplos: ESC [ <N>;<N> m
negro 30 40 reset 0 ESC[m texto normal (sin colores)
rojo 31 41 negrita 1 ESC[1m negrita
verde 32 42 subrayado 4 ESC[33;1m amarillolo
amarillo 33 43 parpadeo 5 ESC[44;37m fondo azul, letra ceniza
azul 34 44 invertido 7 ESC[31;5m rojo parpadeante
rosado 35 45 En la linea de comando:
cyan 36 46 echo -e ‘\e[33;1m amarillo \e[m’
blanco 37 47 echo -e ‘\033[33;1m amarillo \033[m’

Los Metacaracteres de las Expresiones Regulares

Meta Nombre Descripcion
. punto Comodin de un caracter
[] lista Casa cualquiera de los dos caracteres listados
[^] lista negada Casa cualquier caracter, excepto los listados
? opcional La entidad anterior puede aparecer o no (opcional)
* asterisco La entidad anterior puede aparecer en cualquier cantidad
+ mas La entidad anterior debe aparecer como mínimo una vez
{,} llaves La entidad anterior debe aparecer en la cantidad indicada
^ circunflexo Casa el comienzo de la linea
$ peso Casa el fin de la línea
\b borde Limita una palabra (letras, números y subrayado)
\ escape Escape de un meta, quitando su poder
| o Indica alternativas (usar con el grupo)
() grupo Agrupa partes de la expresión, es cuantificable y multinível
\1 retrovisor Recupera el contenido del grupo 1.
\2 retrovisor Recupera el contenido del grupo 2 (sigue hasta el \9)
.* comodin Casa cualquier cosa, es el todo y la nada
?? opcional NG Ídem al opcional común, pero casa el mínimo posible
*? asterisco NG Ídem al asterisco común, pero casa el mínimo posible
+? mas NG Ídem al más común, pero casa el mínimo posible
{}? llaves NG Ídem a las llaves comunes, pero casa el mínimo posible

Códigos Listos para Copiar y Pegar

Condicionales con el IF
if [ -f “$archivo” ]; then echo ‘Archivo encontrado’; fi
if [ ! -d “$dir” ]; then echo ‘Directorio no encontrado’; fi
if [ $i -gt 5 ]; then echo ‘Mayor que 5’; else echo ‘Menor que 5’; fi
if [ $i -ge 5 -la $i -le 10 ]; then echo ‘Entre 5 y 10, incluyendo’; fi
if [ $i -eq 5 ]; then echo ‘=5’; elif [ $i -gt 5 ]; then echo ‘>5’; else echo ‘; fi
if [ “$USER” = ‘root’ ]; then echo ‘Hola root’; fi
if grep -qs ‘root’ /etc/passwd; then echo ‘Usuario encontrado’; fi
Condicionales con el Y (&&) y O (||)
[ -f “$archivo” ] && echo ‘Archivo encontrado’
[ -d “$dir” ] || echo ‘Directorio no encontrado’
grep -qs ‘root’ /etc/passwd && echo ‘Usuario encontrado’
cd “$dir” && rm “$archivo” && touch “$archivo” && echo ‘hecho!’
[ “$1” ] && paran=$1 || paran=’valor patrón’
[ “$1” ] && paran=${1:-valor patrón}
[ “$1” ] || { echo “Uso: $0 parámetro” ; exit 1 ; }
Añadir 1 a la variable $i
i=$(expr $i + 1)
i=$((i+1))
let i=i+1.
let i+=1.
let i++
Loop de 1 a la 10.
sea i in 1 2 3 4 5 6 7 8 9 10; del echo $i; done
sea i in $(seq 10); del echo $i; done
sea ((i=1;i<=10;i++)); del echo $i; done
i=1 ; while [ $i -le 10 ]; del echo $i ; i=$((i+1)) ; done
i=1 ; until [ $i -gt 10 ]; del echo $i ; i=$((i+1)) ; done
Loop en las líneas de un archivo o salida de comando
cat /etc/passwd | while read LINEA; do echo “$LINEA”; done
grep ‘root’ /etc/passwd | while read LÍNEA; do echo “$LÍNEA”; done
while read LINEA; do echo “$LINEA”; done < /etc/passwd
while read LINEA; do echo “$LINEA”; done <(grep ‘root’ /etc/passwd)
Comodines en los ítems del comando case
case “$dir” in /home/*) echo ‘dir dentro del /home’;; esac
case “$user” in root|juan|maria) echo “Hola $user”;; *) echo “No te conozco”;; esac
case “$var” in ?) echo ‘1 letra’;; ??) echo ‘2 letras’;; ??*) echo ‘más de 2’;; esac
case “$i” in [0-un 9]) echo ‘1 dígito’;; [0-un 9][0-un 9]) echo ‘2 dígitos’;; esac
Cajas del Dialog
dialog –calendar ‘abc’ 0 0 31 12 1999.
dialog –checklist ‘abc’ 0 0 0 ítem1 ‘desc1’ on ítem2 ‘desc2’ off
dialog –fselect /tmp 0 0.
(echo 50; sleep 2; echo 100) | dialog –gauge ‘abc’ 8 40 0.
dialog –infobox ‘abc’ 0 0.
dialog –inputbox ‘abc’ 0 0.
dialog –passwordbox ‘abc’ 0 0.
dialog –menú ‘abc’ 0 0 0 ítem1 ‘desc1’ ítem2 ‘desc2’
dialog –msgbox ‘abc’ 8 40.
dialog –radiolist ‘abc’ 0 0 0 ítem1 ‘desc1’ on ítem2 ‘desc2’ off
dialog –tailbox /tmp/archivo.txt 0 0.
dialog –textbox /tmp/archivo.txt 0 0.
dialog –timebox ‘abc’ 0 0 23 59 00.
dialog –yesno ‘abc’ 0 0.

Pista1: dialog ... && echo ‘Apretó OK/Yes’ || echo ‘Apretó Cancel/No’
Pista2: respuesta=$(dialog –stdout –TIPODECAJA ‘abc’ ...)

La Caja de Herramientas del Shellero

Comando Función Opciones útiles
cat Muestra archivo -n, -s
cut Extrae campo -d -f, -c
date Muestra fecha -d, +’...’
diff Compara archivos -u, -Nr, -i, -w
echo Muestra texto -y, -n
find Encuentra archivos -name, -iname, -type f, -exec, -or
fmt Formatea párrafo -w, -u
grep Encuentra texto -i, -v, -r, -qs, -n, -l, -w -x, -A -B -C
head Muestra Inicio -n, -c
od Muestra Caracteres -la, -c, -el, -x
paste Paraleliza archivos -d, -s
printf Muestra texto ninguna
rev Invierte texto ninguna
sed Edita texto -n, -f, s/eso/aquello/, p, d, q, N
seq Cuenta Números -s, -f
sort Ordena texto -n, -f, -r, -k -t, -el
tac Invierte archivo ninguna
tail Muestra Final -n, -c, -f
tee Archiva flujo -la
tr Transforma texto -d, -s, A-Z a-z
uniq Remueve duplicatas -i, -d, -u
wc Cuenta Letras -c, -w, -l, -L.
xargs Administra argumentos -n, -i