我有一个仅包含 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);
}
}