Я пытаюсь создать систему рекордов для игры, над которой я работаю в Bash. До сих пор я придумал систему, в которой я записываю один массив в файл, а затем просто возвращаю его обратно. В настоящее время я пытаюсь выяснить, как записать массив в файл, чтобы он был легко доступен для исходного кода.

Проблема в том, что когда я передаю мой массив в файл, он буквально отображает «$ {highscores [@]}» вместо того, что находится внутри массива рекордов. Код выглядит следующим образом:

 #!/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 "{highscores[@]}"; do
         if [[ $score > $i ]]; then
             num=$((num+1))
             IFS=$'\n' highscores=($(sort <<<"${highscores[*]}"))
             highscores[$num]="$score"
             rm test.test #probably not best way of doing this
             echo 'highscores=( `"${highscores[@]}"` )' >> test.test

         else
             highscores+=("$score")
         fi
     done
     else
         highscores=( "$score" )
         echo 'highscores=( `"${highscores[@]}"` )' >> test.test
 fi

Часть, которую я специально согласен

echo 'highscores=( `"${highscores[@]}"` )' >> test.test

Несмотря на обратные пометки, он по-прежнему не печатает содержимое массива. Вместо этого, то, что он выводит в файл, буквально:

highscores=( "${highscores[@]}" )

Если у кого-то есть более простой или понятный способ сделать это, это тоже сработает!

1 ответ1

1

Это не так, как работают спины. Обратные галочки запускают команду inbetween и расширяют до ее вывода. Если вы просто поместите расширение переменной туда, оболочка все равно попытается запустить расширенное значение как команду.

Кроме того, ни обратные пометки, ни расширения переменных не работают вообще внутри строк в одинарных кавычках.

То, что вы пытались сделать, можно записать так:

echo "highscores=( ${highscores[*]} )" > test.test

echo "highscores=(" "${highscores[@]}" ")" > test.test

Но вместо этого вы можете просто использовать:

declare -p highscores > test.test

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .