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.
No jugar con IFS
No llamar a un comando externo
variable=abc,def,ghij
for i in ${variable//,/ }
do
# call your procedure/other scripts here below
echo "$i"
done
Uso de la manipulación de cadenas bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
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