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
, def
y 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, entredo
ydone
dentro 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
IFS
y luego analice su variable.Espero que esto ayude.
fuente
$variable
contiene 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
!$i
contiene 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"; done
Si establece un separador de campo diferente, puede usar directamente un
for
bucle: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
while
para leer en una matriz y otro para recorrer los resultados.IFS
volver 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