从另一个 bash 脚本编辑 bash 脚本中的变量的最简单方法是什么?

从另一个 bash 脚本编辑 bash 脚本中的变量的最简单方法是什么?

我有一个仅包含 bash 变量的 bash 脚本。例如:

#!/bin/bash
a="foo"
b="bar"

我还有另一个脚本,它应该永久改变第一个脚本的变量的值,因此运行后,第一个脚本应该包含:

#!/bin/bash
a="bar"
b="bar"

我正在寻找实现此目的的最简单方法。我知道可以使用 来完成此操作sed,但我还读到应该可以将第一个脚本导入另一个脚本,然后只需为变量分配一个新值即可。(如果可能的话,我想避免使用正则表达式或解析)但是,我不确定这是否仅适用于正在运行的 shell,或者它是否实际上也更新了第一个脚本文件。是否可以通过源或其他特定于 bash 的内容来更新另一个脚本,还是我应该只使用sed?(我知道可以使用其他工具,例如awk,但我对它们都不熟悉)

就上下文而言,我正在尝试编辑level-name我的 Minecraft 服务器server.properties文件中的值,该文件不完全是扩展名或 shebang 的 bash 脚本,但遵循完全相同的语法。如果更高级的功能需要这样做,我可以向文件中添加 shebang sed是我想要从中更改文件的脚本server.properties

答案1

就上下文而言,我正在尝试编辑我的 Minecraft 服务器的 server.properties 文件中的 level-name 值,它不完全是扩展或 shebang 的 bash 脚本,但遵循完全相同的语法。

不,它不是。它遵循表面上相似格式的“key=value”赋值,但 Java .properties 文件的实际语法与 Bash 脚本中的变量赋值完全不同。尝试使用 Bash 解释器的解析器来解析 .properties 文件是事实上更糟而不是使用正则表达式。

例如,包含破折号的变量名(如level-name)在 Bash 中无效。同样,带有空格的值(如下图所示)在此默认文件中) 除非被引用,否则不会被 Bash 接受。

反之亦然,在 Bash 中有效的分配格式(例如 的输出declare -p var1 var2,这是在 Bash 中用来生成可源脚本的内容)在 .properties 文件中无效。

(我不清楚 Minecraft 的“基岩版”是否使用完全与 Java 兼容的 .properties 解析器,或者是否使用没有转义规则的更简单的解析器,但其默认的 server.properties 仍然与 Bash 语法存在相同的不兼容性。)

因此,如果您想避免手动滚动正则表达式并想使用“真实的东西”,那么请使用 java.util.Properties 类:

// javac setprop.java && java -cp . SetProp server.properties level-name 'Yay'

import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;

class SetProp
{
        public static void main(String args[])
        throws Exception
        {
                if (args.length != 3) {
                        System.err.println("Usage: setprop FILE KEY VALUE");
                        System.exit(2);
                }

                String file = args[0];
                String key = args[1];
                String value = args[2];

                Properties prop = new Properties();
                prop.load(new FileReader(file));
                prop.setProperty(key, value);
                // prop.store(new FileWriter(file), null);
                prop.store(System.out, null);
        }
}

相关内容