我正在尝试为我正在用 Bash 开发的游戏制作一个高分系统。到目前为止,我想到的是一个系统,我将一个数组写入一个文件,然后将其返回。我目前正在尝试弄清楚如何将数组写入文件,以便于获取源。
问题是,当我将数组回显到文件时,它会逐字回显“${highscores[@]}”,而不是 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
反引号不是这样工作的。反引号运行命令之间并扩展到其输出如果你只是把变量扩展放在那里,shell 仍然会尝试跑步无论如何,将扩展值作为命令。
此外,在单引号字符串中,反引号和变量扩展根本不起作用。
您尝试做的事情可以写成:
echo "highscores=( ${highscores[*]} )" > test.test
echo "highscores=(" "${highscores[@]}" ")" > test.test
但你也可以使用:
declare -p highscores > test.test