Twórz zmienne i przypisuj wartości za pomocą pętli (bash)

12

Czy istnieje sposób tworzenia zmiennych bash i przypisywania im wartości za pomocą pętli?

Coś w stylu:

#!/bin/bash

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

EDYCJA: Dziękuję @Costas i @mdpc za wskazanie, że byłaby to zła alternatywa dla listy; pytanie jest tylko teoretyczne.

toksefa
źródło
1
UWAGA: Należy pamiętać, że konfiguracja zmieni / zmodyfikuje / przypisze zmienne tylko w bieżącym procesie, a NIE proces nadrzędny, jeśli wykonasz to jako polecenie. Możesz pobrać plik za pomocą „.” polecenie (EX:. new_vars), aby stało się to w ramach bieżącego procesu.
mdpc,
Ok, ale powyższe nie działa tak naprawdę; var"$c"psuje to. Odpowiedź @Costas pokazuje, jak przypisać wiele wartości do jednej zmiennej listy - tylko teoretycznie pytam, czy zmienne mogą być generowane za pomocą pętli.
toksefa
Hmmm ... dlaczego tak skomplikowane, samo użycie nowej zmiennej tworzy ją bez fanfar.
mdpc

Odpowiedzi:

14

Cóż, absolutnie możesz używać eval w następujący sposób:

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

Ten kod utworzy zmienne o nazwach var0, var1, var2, ... z których każda zawiera nazwę pliku. Zakładam, że będziesz miał dobry powód, aby to zrobić za pomocą tablicy ...

Bichoj
źródło
5

Możliwe, że masz na myśli tablicę. Istnieje kilka sposobów przypisywania wartości

Pierwszy:

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

Druga:

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

Trzeci:

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

Czwarty:

var=( $(ls) )

Piąty

...

  1. nie ma potrzeby używania ls, wystarczy umieścić *wszystkie pliki
  2. wewnątrz znak może być, pominięte[]$
Costas
źródło
Dziękuję Ci; moje pytanie jest potencjalnie bardziej teoretyczne niż praktyczne. Jednak gdy echo $varwykonuję polecenia wymienione powyżej, otrzymuję tylko pierwszy plik „wymieniony” przez ls. czy robię coś źle?
toksefa
1
Jeśli chcesz wypisać wszystkie tablice, których musisz użyć echo ${var[*]}(lub ${var[@]}), pojedynczy element można wywołać jak echo ${var[1]}. Uwaga: $varjest równy${var[0]}
Costas
1
@ py4on Innym sposobem jest użycie pętli:for v in "${var[@]}";do echo $v;done
Costas