Schreibbares importierbares Array in eine Datei in Bash?

585
Egrodo

Ich versuche, ein Highscore-System für ein Spiel zu erstellen, an dem ich in Bash arbeite. Bis jetzt habe ich ein System entwickelt, bei dem ich ein einzelnes Array in eine Datei schreibe und es danach einfach zurücksende. Ich versuche gerade herauszufinden, wie das Array so in die Datei geschrieben werden kann, dass es leicht quellfähig ist.

Das Problem ist, wenn ich mein Array in der Datei wiederhole, es gibt die "$ " wörtlich anstelle des Inhalts des Highscores-Arrays wieder. Der Code lautet wie folgt:

 #!/bin/bash #TODO Input an array from a file, read input from user, test if it's larger than any of the top 10, add it in there accordingly. #TODO Make it handle multiple high scores. num=0 read -rp "enter score: " score if [ -f test.test ]; then . test.test for i in ""; do if [[ $score > $i ]]; then num=$((num+1)) IFS=$'\n' highscores=($(sort <<<"$")) highscores[$num]="$score" rm test.test #probably not best way of doing this echo 'highscores=( `"$"` )' >> test.test  else highscores+=("$score") fi done else highscores=( "$score" ) echo 'highscores=( `"$"` )' >> test.test fi 

Der Teil, den ich besonders bespreche

echo 'highscores=( `"$"` )' >> test.test 

Trotz der Backticks wird der Inhalt des Arrays immer noch nicht gedruckt. Stattdessen ist das, was an die Datei erinnert, wörtlich:

highscores=( "$" ) 

Wenn jemand eine einfachere oder klarere Möglichkeit hat, dies zu tun, würde das auch funktionieren!

0

1 Antwort auf die Frage

1
grawity

So funktionieren Backticks nicht. Backticks führen den Befehl zwischendurch aus und erweitern dessen Ausgabe . Wenn Sie lediglich eine Variablenerweiterung dort ablegen, versucht die Shell trotzdem, den erweiterten Wert als Befehl auszuführen .

Weder Backticks noch variable Erweiterungen funktionieren in Strings mit einfachen Anführungszeichen.

Was Sie versucht haben, kann wie folgt geschrieben werden:

echo "highscores=( $ )" > test.test  echo "highscores=(" "$" ")" > test.test 

Stattdessen können Sie einfach Folgendes verwenden:

declare -p highscores > test.test