Escreve array importável para arquivo no Bash?

0

Estou tentando criar um sistema de pontuação alta para um jogo no qual estou trabalhando no Bash. Até agora, o que eu tenho é um sistema onde eu escrevo um único array em um arquivo e depois o recoloco depois. No momento, estou tentando descobrir como gravar o array no arquivo, de modo que ele seja facilmente possível.

O problema é quando faço eco da minha matriz para o arquivo que ecoa o "$ {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 sou especificamente concer

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

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

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

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

    
por Egrodo 24.02.2017 / 21:54

1 resposta

1

Não é assim que funcionam os backticks. Backticks executam o comando entre eles e expandem para sua saída . Se você simplesmente 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 em todas as strings entre 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 simplesmente usar:

declare -p highscores > test.test
    
por 24.02.2017 / 22:15