Solución al reto del script
BSD
Bueno, ya ha pasado una semana desde la publicación del reto, ahora la solución.
Para el primer caso la cosa es senciila, usamos el comando read para obtener los valores de la entrada estandar (stdin):
#!/bin/ksh
while read args; do
echo $args
done
En el segundo caso lo único que tenemos que hacer es checar si se pasaron argumentos al script:
#!/bin/ksh
if (( $0 )); then
while [[ $1 != "" ]]; then
echo $1
shift
done
fi
Y para el tercer caso si creen que es la unión de los dos casos anteriores están mal por un detalle:
Uniendo ambos códigos:
#!/bin/ksh
if (( $# )); then
while [[ $1 != "" ]]; then
echo $1
shift $1
done
else
while read args; then
if [[ $args == "" ]]; then
echo "Usage: $0 args"
exit 1
else
echo $args
fi
done
fi
y checamos las sitaciones:
$ ls | ./script.sh
script.sh main.c a.out
$ ./script.sh $( ls )
script.sh main.c a.out
$ ./script.sh
Notaran que cuando no se dan argumentos en lugar de mostrar la forma de uso del script lo que hace este es esperar a que tecleemos algo y luego mostrarnoslo hasta que presionemos Ctrl+D:
$ ./script.sh
do it!
do it!
show the usage!
show the usage!
^D
$
esto es por la instruccion "read args".
La unica forma de poder hacer esto de forma eficiente sería a través de un programa en código C o usando este sencillo hack:
#!/bin/ksh
if (( $# )); then
set -A names -- "$@"
else
set -A names -- $([[ -t 0 ]] || cat)
fi
# Si no hubieron argumentos se muestra la forma de uso
if (( ${#names[*]} == 0 )); then
print -u2 "Usage: $0 args"
exit 1
fi
# En caso contrario hacemos el trabajo
for name in "${names[@]}"; do
print -r -- "$name";
done
Fácil ¿no?
Este post va dedicado a mirabilos, el líder del proyecto MirOS BSD quien fue el que me enseño.
P.D.
Último reto: describir qué es lo que hace el código.
Permalink: http://mononeurona.org/entries/view/asarch/1805
Comentblogs:Hola asarch, que chido que conozcas a los "buenos".
suerte amigo.
1.-primer if..else..fi
Observa si hay argumentos, en caso de haberlos los asigna al array names, de lo contrario toma lo que hay en la entrada estandar y lo mete en names.
2.-Segundo if...fi
Obtiene el numero de elementos en el array names, si es cero manda un mensaje al error estandar (stderr) y termina la ejecucion.
3.-El for recorre todos los array names, y los imprime ignorando los caracteres escapados.
2009-05-14 21:04:04-05










