Este grupo de trabajo ha estado largas horas investigando respuestas a tu pregunta, te dejamos la respuesta por esto nuestro objetivo es serte de mucha apoyo.
Solución:
No necesita un archivo temporal para hacer esto, y sed (o awk) son mucho más flexibles en el procesamiento de comentarios que una declaración de caso de shell.
Por ejemplo:
configfile='/opt/myconfigfile.txt'
[ $# -gt 0 ] && [ -r "$1" ] && configfile="$1"
sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$configfile" |
while read var1 var2 var3 var4; do
# stuff with var1, etc.
done
Esto elimina los comentarios (con o sin espacios en blanco iniciales) y elimina las líneas vacías de la entrada antes de canalizarlas al ciclo while. Maneja los comentarios en las líneas por sí mismos y los comentarios agregados al final de la línea:
# full-line comment
# var1 var2 var3 var4
abc 123 xyz def # comment here
Vocación sed
o awk
para tareas como esta no es “absurdo”, es perfectamente normal. Para eso están estas herramientas. En cuanto al rendimiento, apostaría a que en todo menos en archivos de entrada muy pequeños, el sed
La versión sería mucho más rápida. Tubería a sed
tiene algunos gastos generales de inicio pero se ejecuta muy rápido, mientras que el shell es lento.
Esto funciona porque read
rompe todo en espacios en blanco (IFS), por lo que si var1 está vacío o comienza con ‘#’, sáltelo.
while read var1 var2 var3 var4; do
case $var1 in
''|#*) continue ;; # skip blank lines and lines starting with #
esac
echo "var1: '$var1'"
# stuff with var1, etc.
done < "$1:-default_config_file"
Luego, la entrada debe redirigirse al bucle en lugar de al while
lista de comandos El "$1:-default_config_file"
se expande al primer parámetro de la línea de comando si no está vacío; de lo contrario, se expande a default_config_file
también puede usar expansión variable, etc. en el valor predeterminado string.
Debido a que está interesado en minimizar el preprocesamiento, creo que esto es equivalente, pero también elimina todos los comentarios:
while read line; do
echo "$line%%#*" |
read var1 var2 var3 var4
[ -z "$var1" ] && continue
# stuff with var1, etc.
for i in 1 2 3 4; do eval echo ""var$i: $var$i""; done #debug only!
done < "$1:-default_config_file"
Esto utiliza la función de procesamiento de subcadenas de expansión de parámetros de shell. $line%%#*
se expande al valor original de line
excepto el primero #
y todo después de que se eliminan. Carga eso en var1-4
y continuar como de costumbre. la prueba a continue
se acorta porque ahora solo necesitamos verificar si está vacío stringno #
.
Comentarios y puntuaciones del artículo
Acuérdate de que te brindamos la opción de parafrasear tu experiencia si te fue de ayuda.