Erstellen Sie Variablen und weisen Sie Werte über eine Schleife (Bash) zu.

12

Gibt es eine Möglichkeit, Bash-Variablen zu erstellen und diese über eine Schleife zuzuweisen?

Etwas in der Art von:

#!/bin/bash

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

EDIT: Vielen Dank an @Costas und @mdpc für den Hinweis, dass dies eine schlechte Alternative zu einer Liste wäre. Die Frage ist nur theoretisch.

Toxefa
quelle
1
HINWEIS: Beachten Sie, dass Ihr Setup Variablen nur im aktuellen Prozess und NICHT im übergeordneten Prozess ändert / modifiziert / zuweist, wenn Sie dies als Befehl ausführen. Sie können die Datei mit dem '.' Befehl (EX :. new_vars), um dies innerhalb des aktuellen Prozesses zu ermöglichen.
Mdpc
Ok, aber das oben genannte funktioniert nicht tatsächlich ausgeführt; var"$c"bricht es. Die Antwort von @Costas zeigt, wie einer einzelnen Listenvariablen mehrere Werte zugewiesen werden. Ich frage nur theoretisch, ob Variablen tatsächlich mit einer Schleife generiert werden können .
Toxefa
Hmmm ... warum so kompliziert, wenn man nur eine neue Variable verwendet, entsteht sie ohne Fanfare.
Mdpc

Antworten:

14

Nun, Sie können eval wie folgt verwenden:

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

Dieser Code erstellt Variablen mit den Namen var0, var1, var2, ..., wobei jede den Dateinamen enthält. Ich gehe davon aus, dass Sie einen guten Grund haben werden, dies über die Verwendung eines Arrays zu tun ...

Bichoy
quelle
5

Möglicherweise meinst du Array. Es gibt verschiedene Möglichkeiten, Werte zuzuweisen

Zuerst:

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

Zweite:

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

Dritte:

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

Vierte:

var=( $(ls) )

Fünfte

...

  1. Es ist nicht erforderlich ls, nur *für alle Dateien zu setzen
  2. innerhalb []des $Schildes kann weggelassen werden
Costas
quelle
Vielen Dank; Meine Frage ist möglicherweise eher theoretisch als praktisch. Wenn ich jedoch echo $vardie oben aufgeführten Befehle verwende, erhalte ich nur die erste Datei, die von aufgelistet wurde ls. Mache ich etwas falsch?
Toxefa
1
Wenn Sie alle Arrays ausgeben möchten, die Sie verwenden müssen echo ${var[*]}(oder ${var[@]}), kann ein einzelnes Element wie aufgerufen werden echo ${var[1]}. Hinweis: $varist gleich${var[0]}
Costas
1
@ py4on Ein anderer Weg ist die Verwendung einer Schleife:for v in "${var[@]}";do echo $v;done
Costas