Escrever array importável para arquivo no Bash?


0

Estou tentando criar um sistema de pontuação alta para um jogo em que estou trabalhando no Bash. Até agora, o que eu criei é um sistema em que eu escrevo uma única matriz em um arquivo e depois apenas a refiro depois. Atualmente, estou tentando descobrir como gravar a matriz no arquivo, de modo que seja facilmente capaz de fonte.

O problema é que, quando eu ecoo minha matriz no arquivo, ela ecoa os "$ {highscores [@]}" literalmente, em vez do que está dentro da matriz de recordes. O código é o seguinte:

 #!/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

A parte que eu estou especificamente interessada

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

Apesar dos backticks, ele ainda não imprime o conteúdo da matriz. Em vez disso, o que ecoa no arquivo é literalmente:

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

Se alguém tiver uma maneira mais fácil ou clara de fazer isso, também funcionaria!

Respostas:


1

Não é assim que os backticks funcionam. Os backticks executam o comando entre eles e expandem para sua saída . Se você apenas colocar uma expansão variável lá, o shell ainda tentará executar o valor expandido como um comando de qualquer maneira.

Além disso, nem backticks nem expansões variáveis ​​funcionam dentro de strings de aspas simples.

O que você tentou fazer pode ser escrito como:

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

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

Mas, em vez disso, você pode apenas usar:

declare -p highscores > test.test
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.