Supongamos que tengo una variable de shell de Unix como se muestra a continuación
variable=abc,def,ghij
Quiero extraer todos los valores ( abc, defy ghij) usando un bucle for y pasar cada valor a un procedimiento.
El script debería permitir extraer un número arbitrario de valores separados por comas de $variable.

Respuestas:
Puede usar la siguiente secuencia de comandos para recorrer dinámicamente su variable, sin importar cuántos campos tenga, siempre que solo esté separada por comas.
En lugar de la
echo "$i"llamada anterior, entredoydonedentro del bucle for, puede invocar su procedimientoproc "$i".Actualización : el fragmento de código anterior funciona si el valor de la variable no contiene espacios. Si tiene tal requisito, use una de las soluciones que pueden cambiar
IFSy luego analice su variable.Espero que esto ayude.
fuente
$variablecontiene espacios en blanco, por ejemplo,variable=a b,c,d=> imprime 4 líneas (a | b | c | d) en lugar de 3 (ab | c | d)"value**. ¿Podría actualizar si hay alguna expresión regular para eliminar eso?No jugar con IFS
No llamar al comando externo
Uso de manipulación de cadenas de bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
fuente
IFS!$icontiene espacios, se dividirán (y esa podría ser la razón por la que se pasa como separados por comas en lugar de separados por espacios)for i in ${variable//,/$IFS} do; echo "$i"; doneSi establece un separador de campo diferente, puede usar directamente un
forbucle:También puede almacenar los valores en una matriz y luego recorrerla como se indica en ¿Cómo divido una cadena en un delimitador en Bash? :
Prueba
Puede encontrar un enfoque más amplio en esta solución sobre cómo recorrer una lista separada por comas y ejecutar un comando para cada entrada .
Ejemplos sobre el segundo enfoque:
fuente
whilepara leer en una matriz y otro para recorrer los resultados.IFSvolver a lo que era antes?Prefiero usar tr en lugar de sed, porque sed tiene problemas con caracteres especiales como \ r \ n en algunos casos.
otra solución es establecer IFS en cierto separador
fuente
Aquí hay una solución alternativa basada en tr que no usa eco, expresada como una línea.
Se siente más ordenado sin eco, pero esa es solo mi preferencia personal.
fuente
Prueba este.
fuente
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file. Después de eso, conviértalo en bucle for en bucle while. Puedes conseguir ese.Otra solución que no usa IFS y aún conserva los espacios:
fuente
Aquí está mi solución bash pura que no cambia IFS y puede incluir un delimitador de expresiones regulares personalizado.
fuente