Crea variabili e assegna valori tramite loop (bash)


12

C'è un modo per creare variabili bash e assegnare loro valori tramite un ciclo?

Qualcosa sulla falsariga di:

#!/bin/bash

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

EDIT: Grazie a @Costas e @mdpc per aver sottolineato che sarebbe una pessima alternativa a un elenco; la domanda è solo teorica.


1
NOTA: tenere presente che la configurazione cambierà / modificherà / assegnerà le variabili solo nel processo corrente e NON nel processo principale se lo si esegue come comando. È possibile eseguire il sorgente del file utilizzando '.' comando (EX:. new_vars) per far sì che ciò avvenga all'interno del processo corrente.
mdpc,

Ok, ma quanto sopra non funziona effettivamente eseguito; var"$c"lo rompe. La risposta di @Costas dimostra come assegnare più valori a una singola variabile di elenco - sto solo chiedendo teoricamente se le variabili possano essere effettivamente generate con un ciclo.
Toxefa,

Hmmm ... perché così complicato, semplicemente usando una nuova variabile lo crea senza fanfara.
mdpc,

Risposte:


14

Bene, puoi assolutamente usare eval come segue:

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

Questo codice creerà variabili denominate var0, var1, var2, ... con ognuna con il nome del file. Presumo che avrai una buona ragione per cui vuoi farlo usando un array ...


5

Forse intendi array. Esistono alcuni modi per assegnare valori

Primo:

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

Secondo:

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

Terzo:

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

Il quarto:

var=( $(ls) )

Quinto

...

  1. non è necessario utilizzare ls, basta inserire *tutti i file
  2. all'interno []del $cartello può essere inserito

Grazie; la mia domanda è potenzialmente più teorica che realmente pratica. Tuttavia, quando echo $varcon i comandi che elenchi sopra ottengo solo il primo file "elencato" per ls. Sto facendo qualcosa di sbagliato?
Toxefa,

1
Se si desidera produrre tutti gli array che è necessario utilizzare echo ${var[*]}(o ${var[@]}), è possibile chiamare un singolo elemento come echo ${var[1]}. Nota: $varè uguale${var[0]}
Costas,

1
@ py4on L'altro modo è usare un ciclo:for v in "${var[@]}";do echo $v;done
Costas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.