one loop for array shell loops unix for-loop cut

shell - loop - if bash



Recorrer una variable de shell separada por comas (7)

Supongamos que tengo una variable de shell Unix como 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 debe permitir extraer un número arbitrario de valores separados por comas de $variable .


Aquí hay una solución alternativa basada en tr que no usa echo, expresada como una línea.

for v in $(tr '','' ''/n'' <<< "$var") ; do something_with "$v" ; done

Se siente más ordenado sin eco, pero esa es solo mi preferencia personal.



Otra solución que no usa IFS y aún conserva los espacios:

$ var="a bc,def,ghij" $ while read line; do echo line="$line"; done < <(echo "$var" | tr '','' ''/n'') line=a bc line=def line=ghij


Prueba este.

#/bin/bash testpid="abc,def,ghij" count=`echo $testpid | grep -o '','' | wc -l` # this is not a good way count=`expr $count + 1` while [ $count -gt 0 ] ; do echo $testpid | cut -d '','' -f $i count=`expr $count - 1 ` done


Puede usar el siguiente script para recorrer dinámicamente su variable, sin importar cuántos campos tenga, siempre que solo esté separada por comas.

variable=abc,def,ghij for i in $(echo $variable | sed "s/,/ /g") do # call your procedure/other scripts here below echo "$i" done

En lugar de la llamada echo "$i" anterior, entre do y done dentro del ciclo for, puede invocar su procedimiento de procedimiento proc "$i" .

Actualización : el fragmento anterior funciona si el valor de la variable no contiene espacios. Si tiene ese requisito, utilice una de las soluciones que pueden cambiar IFS y luego analice su variable.

Espero que esto ayude.


Si configura un separador de campo diferente, puede usar directamente un bucle for :

IFS="," for v in $variable do # things with "$v" ... done

También puede almacenar los valores en una matriz y luego recorrerlos como se indica en ¿Cómo divido una cadena en un delimitador en Bash? :

IFS=, read -ra values <<< "$variable" for v in "${values[@]}" do # things with "$v" done

Prueba

$ variable="abc,def,ghij" $ IFS="," $ for v in $variable > do > echo "var is $v" > done var is abc var is def var is ghij

Puede encontrar un enfoque más amplio en esta solución de Cómo iterar a través de una lista separada por comas y ejecutar un comando para cada entrada .

Ejemplos sobre el segundo enfoque:

$ IFS=, read -ra vals <<< "abc,def,ghij" $ printf "%s/n" "${vals[@]}" abc def ghij $ for v in "${vals[@]}"; do echo "$v --"; done abc -- def -- ghij --


#/bin/bash TESTSTR="abc,def,ghij" for i in $(echo $TESTSTR | tr '','' ''/n'') do echo $i done

Prefiero usar tr en lugar de sed, porque tengo problemas con caracteres especiales como / r / n en algunos casos.

otra solución es establecer IFS en cierto separador