Créer des variables et attribuer des valeurs via une boucle (bash)

12

Existe-t-il un moyen de créer des variables bash et de leur attribuer des valeurs via une boucle?

Quelque chose dans le sens de:

#!/bin/bash

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

EDIT: Merci à @Costas et @mdpc d'avoir souligné que ce serait une mauvaise alternative à une liste; la question n'est que théorique.

toxefa
la source
1
REMARQUE: sachez que votre configuration ne changera / modifiera / assignera des variables que dans le processus en cours et NON dans le processus parent si vous l'exécutez en tant que commande. Vous pouvez source le fichier en utilisant le '.' (EX:. new_vars) pour que cela se produise dans le processus actuel.
mdpc
D'accord, mais ce qui précède ne fonctionne pas réellement; var"$c"le casse. La réponse de @Costas montre comment attribuer plusieurs valeurs à une seule variable de liste - je demande simplement théoriquement si des variables peuvent réellement être générées avec une boucle.
toxefa
Hmmm ... pourquoi si compliqué, le simple fait d'utiliser une nouvelle variable la crée sans fanfare.
mdpc

Réponses:

14

Eh bien, vous pouvez absolument utiliser eval comme suit:

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

Ce code créera des variables nommées var0, var1, var2, ... chacune contenant le nom du fichier. Je suppose que vous aurez une bonne raison de vouloir le faire en utilisant un tableau ...

Bichoy
la source
5

Possible, vous voulez dire tableau. Il existe plusieurs façons d'attribuer des valeurs

Première:

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

Seconde:

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

Troisième:

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

Quatrième:

var=( $(ls) )

Cinquième

...

  1. il n'est pas nécessaire d'utiliser ls, il suffit de mettre *pour tous les fichiers
  2. à []l' intérieur du $signe peut être omis
Costas
la source
Je vous remercie; ma question est potentiellement plus théorique que pratique. Cependant, lorsque j'utilise echo $varles commandes que vous listez ci-dessus, je ne reçois que le premier fichier "répertorié" par ls. Est-ce que je fais quelque chose de mal?
toxefa
1
Si vous voulez sortir tous les tableaux que vous devez utiliser echo ${var[*]}(ou ${var[@]}), un seul élément peut être appelé comme echo ${var[1]}. Remarque: $varest égal${var[0]}
Costas
1
@ py4on L'autre moyen est d'utiliser une boucle:for v in "${var[@]}";do echo $v;done
Costas