Comandos

Comandos

Es una exigencia de POSIX que los comandos internos (builtin-commands) estén disponibles también como comandos externos.

break

para salir de un bucle, si se añade un valor numérico ese será el de niveles de bucles

:

comando nulo, es más rápido que true (while :) , se puede iniciar un come ntario con dos puntos al principio de la línea (menos eficiente que #) y para configuraci ón adicional de las variables ???? (MIRAR ESTO)

: ${var:=value}
sin los dos puntos la shell intentaría evaluar ${var} como un comando.

continue

hace que los bucles for while o until continuen hasta la siguiente iterac ión. Se puede usar con un parámetro adicional.

for x in 1 2 3 
do
echo before $x
continue 1
echo after $x
done


before 1
before 2
before 3

.

El comando punto ejecuta el comando en la shell actual

. ./shell_script
Cuando se ejecuta un comando externo o un script se crea un subshell y el comando se ejecuta en el nuevo entorno. source y . (punto) son sinónimos. Puede usarse para incorporar definiciones de variables y funciones a un script o para modificar el entorno actual a fin de ejecutar algunos comandos (con otra versión del compilador etc..)

source ./.bashrc
. ./.bashrc.custom

echo

eval

jorge@debian:~/DEV/bash/apuntes$ foo=10
jorge@debian:~/DEV/bash/apuntes$ x=foo
jorge@debian:~/DEV/bash/apuntes$ y='$'$x
jorge@debian:~/DEV/bash/apuntes$ echo $y
$foo
jorge@debian:~/DEV/bash/apuntes$ eval y='$'$x
jorge@debian:~/DEV/bash/apuntes$ echo $y
10
Eval permite generar código y que se ejecute sobre la marcha.

exec

reemplaza el shell actual por un comando diferente. Tras exec ya no se ejecutará ningún comando del script porque la shell donde se ejecuta este ya no existe.

Otro uso de exec sería exec 3< afile, que abre el descriptor de archivo 3 para leerlo desde "afile".

exit

exit n envía el código de salida. Si no se especifica, el script enviará el código de salida del último comando ejecutado. 0 indica éxito, se pueden usar además del1 al 125. Los demás valores tienen significados reservados.

126 El archivo no es ejecutable
127 No se encontró un comando
128 Y siguientes, hubo una señal

export

hace que la variable que se llama como el parámetro esté disponible en las subshells.

set -a
set --allexports ambos exportarán todas las variables de aquí en adelante.

expr

evalúa sus argumentos como si fueran una expresión

x=`expr $x + 1`
x=$(expr $x + 1)
expr1 | expr2 expr1 si no es cero, sino expr2
expr1 & expr2 cero si alguna es cero, sino expr1
=
>
>=
<
<=
!=
+
-
*
/
expr1%expr2 módulo entero

expr se suele reemplazar por $((...)) que es más eficiente

printf

printf "format string" parametro1 parametro2 ... Todos los caracteres que no sean % y \ aparecen literalmente en la salida.

\" comillas dobles
\\ barra invertida
\a campana
\b retroceso de espacio
\c elimina el resto de salidas
\f salto de página
\n nueva línea
\r retorno de carro
\t tabulador
\v tabulador vertical
\ooo caracter único con valor octal ooo
\xHH caracter único con valor hexadecimal HH

Algunos especificadores de conversión

%D número decimal
%C caracter
%S cadena
%% envía el caracter literal %

return

retornamos un valor para el script que llama a la función, si no se especifica, envía el código de salida del último comando de la función

set

configura los valores de parámetro de la shell. Puede ser útil para usar campos en comando que envían valores separados por comas

set $(date)
echo el mes es $2
también se puede usar para controlar el modo de ejecución del shell mediante la transmisión de parámetros. set -x sirve para que el script muestre una traza del comando que se está ejecutando en ese momento.

shift

reduce en uno todos los parámetros posicionale. $0 no varía, con lo qque desaparece $1. Si se le especifica un valor, las variables se mueven todas esas posiciones. $* $@ y $# se modifican automáticamente

while [ $1 != "" ] ; do
echo $1
shift
done
sirve para escanear todos los parámetros posicionales y se necesitará siempre que tengamos más de nueve.

trap

se utiliza para especificar las acciones a realizar cuando se reciban las señales.

jorge@debian:~/DEV/bash/apuntes$ trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
trap.sh (no me funciona, hay que averiguar porqué)

#!/bin/sh

trap `rm -f /tmp/my_tmp_file_$$` INT
echo creando fichero /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$

echo "presiona (CTL-C) para interrumpir..."
while [ -f /tmp/my_tmp_file_$$ ] ; do
echo el fichero existe
sleep 1
done

echo el fichero ya no existe
trap INT
echo creando fichero /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$

echo "presiona (CTL-C) para interrumpir..."
while [ -f /tmp/my_tmp_file_$$ ] ; do
echo el fichero existe
sleep 1
done

echo nunca va a llegar a esta línea

exit 0

unset

elimina variables y funciones del entorno. No puede hacerlo con las variables de lectura definidas por la propia shell.

No hay comentarios:

Publicar un comentario