Cambiando el contenido de la variable IFS podemos conseguir que el cat <archivo> nos devuelva una linea entera sin tener en cuenta los espacios.
ejemplo:
DIFS="$IFS" # separador fin de linea para que salga linea por linea
IFS=$'\n'
for x in $(cat $PROYECTO | grep -v ^# )
do
can=$(echo $x | awk -v FS="/" '{print $(NF)}')
echo "($conta) $can"
CANCIONES["$conta"]="$can"
let conta=$conta+1
done
IFS="$DIFS"
otro ejemplo:
elegirArchivo()
{
## Nos permite elejir un archivo, recibe como
## argumento el directorio de inicio.
titulo "ELEGIR ARCHIVO"
OPCION="$1"
echo -e "->$cc $OPCION $fc"
eval $imp_linea
while [ -d "$OPCION" ]
do
DOPCION="$OPCION"
DIFS="$IFS" ; IFS=$'\n' # Separador fin de linea
select OPCION in 'Salir' 'Atras' 'Todo el directorio' ${OPCION}/*
do
IFS="$DIFS" # restauramos separador
if [ "$OPCION" = "Atras" ] ; then OPCION=$1 ; fi
if [ "$OPCION" = "Todo el directorio" ] ; then
FILE="$DOPCION"
anadir_directorio $FILE
break
fi
echo -e "->$cc $OPCION $fc"
eval $imp_linea
break
done
done
FILE="$OPCION"
}
Otra forma de hacerlo mas elegante
La solución más sencilla es simplemente cambiar el "for" por un "while" ya que el "while" le asignará a la variable toda la cadena independientemente de que tenga espacios o no, quedaría como sigue:
ls *ogg | while read i ; do
lo_que_sea $i
done
y otra mas:
for i in *; do echo "$i"; done
Sin utilizar ls directamente con el comodín salen los archivos bien.
ejemplo:
acertijo () {
(( " $# == 0 " )) && echo dame un nmr \< 10 && return 0;
[[ ${1:0:1} == ${RANDOM:0:1} ]] && echo ok || echo fallaste
}
ejemplo:
set -- /bin/* ; inicio=10 ; final=1 ; echo ${@:inicio:final}
debuelve un rango de valores, empieza en el 10 y le uno solo.
Elimina las columnas de la 1 a la 20
ejemplo:
ls -l | colrm 1 20
Nos aseguramos que el directorio de la aplicación es realmente el suyo y no el de un enlace simbolico
# Si es un enlace hay que buscar el directorio de programas sobre al que apunta
if [ -L "$0" ] ; then
DIR_PROGRAMAS=$(dirname "`readlink $0`")
else
DIR_PROGRAMAS=$(dirname "$0")
fi
En caso de ejecutarse el script directamente lanzamos función interna.
[[ "`basename $BASH_SOURCE`" = "`basename $0`" ]] && funcion_interna