Crear variables y asignar valores a través de un bucle (bash)

12

¿Hay alguna manera de crear variables bash y asignarles valores a través de un bucle?

Algo en la línea de:

#!/bin/bash

c=0
for file in $( ls ); do
    var"$c"="$file";
    let c=$c+1;
done

EDITAR: Gracias a @Costas y @mdpc por señalar que esta sería una mala alternativa a una lista; La pregunta es solo teórica.

toxefa
fuente
1
NOTA: Tenga en cuenta que su configuración cambiará / modificará / asignará variables solo en el proceso actual y NO en el proceso principal si ejecuta esto como un comando. Puede obtener el archivo usando el '.' comando (EX:. new_vars) para que esto suceda dentro del proceso actual.
mdpc
Ok, pero lo anterior no funciona realmente; var"$c"lo rompe La respuesta de @Costas demuestra cómo asignar múltiples valores a una sola variable de lista: solo estoy preguntando teóricamente si las variables realmente se pueden generar con un bucle.
toxefa
Hmmm ... por qué es tan complicado, solo usar una nueva variable lo crea sin ninguna fanfarria.
mdpc

Respuestas:

14

Bueno, absolutamente puedes usar eval de la siguiente manera:

c=0
for file in $( ls ); do
    eval "var$c=$file";
    c=$((c+1));
done

Este código creará variables llamadas var0, var1, var2, ... cada una con el nombre del archivo. Supongo que tendrá una buena razón por la que desea hacerlo usando una matriz ...

Bichoy
fuente
5

Posible te refieres a matriz. Hay algunas formas de asignar valores.

Primero:

c=0
for file in $( ls ); do
    var[$c]="$file";
    c=$(($c+1));
done

Segundo:

c=0
for file in $( ls ); do
    var[c++]="$file";
done

Tercero:

for file in $( ls ); do
    var[${#var}]="$file";
done

Cuarto:

var=( $(ls) )

Quinto

...

  1. no hay necesidad de usar ls, solo ponga *todos los archivos
  2. dentro []del $letrero se puede omitir
Costas
fuente
Gracias; Mi pregunta es potencialmente más teórica que práctica. Sin embargo, cuando uso echo $varlos comandos que enumeras arriba solo obtengo el primer archivo 'listado' por ls. ¿Estoy haciendo algo mal?
toxefa
1
Si desea generar toda la matriz que tiene que usar echo ${var[*]}(o ${var[@]}), se puede llamar como elemento único echo ${var[1]}. Nota: $vares igual${var[0]}
Costas
1
@ py4on Otra forma es usar un bucle:for v in "${var[@]}";do echo $v;done
Costas