在我的配置文件中增加我的服务器端口

Increment my server-port in my Config file

我想制作一个 Bash 脚本,如果我 运行 我的脚本,它会在我的配置文件中每次使用 +1 增加我的服务器端口选项。我的配置文件如下所示。

server-port=1000
server-online=true
level-name=Hapos
type=XZC

作为示例,它需要如何工作

# ./script.sh
we will now change the port
# cat config.txt
1001
-----------------
# ./script.sh
we will now change the port
# cat config.txt
1002
-----------------
# ./script.sh
we will now change the port
# cat config.txt
1003

用 awk 递增

让我们从这个配置文件开始:

$ cat config.txt 
server-port=1000
server-online=true
level-name=Hapos
type=XZC

我们可以使用 awk 增加端口:

$ awk -F= -v OFS== ' == "server-port"{++} 1' config.txt 
server-port=1001
server-online=true
level-name=Hapos
type=XZC

代码的工作原理如下:

  • -F= 将输入的字段分隔符设置为 =

  • -v OFS== 将输出的字段分隔符设置为 =

  • == "server-port"{++} 测试第一个字段是否为 server-port。如果是,它会增加第二个字段。

  • 1 是 awk 的神秘 shorthand 打印行。

使用现代 (>=4.1.0) GNU awk 就地更改

$ awk -i inplace -F= -v OFS== ' == "server-port"{++} 1' config.txt 
$ cat config.txt 
server-port=1001
server-online=true
level-name=Hapos
type=XZC
$ awk -i inplace -F= -v OFS== ' == "server-port"{++} 1' config.txt 
$ cat config.txt 
server-port=1002
server-online=true
level-name=Hapos
type=XZC

与其他 awk 就地更改

$ awk -F= -v OFS== ' == "server-port"{++} 1' config.txt >tmp$$ && mv tmp$$ config.txt
$ cat config.txt 
server-port=1003
server-online=true
level-name=Hapos
type=XZC

替代输入文件

假设我们的文件有一个破折号,上面的破折号有一个等号:

$ cat config.txt
server-port-1000
server-online=true
level-name-Hapos
type=XZC

使用 GNU awk,我们可以增加端口号:

awk -i inplace -F- -v OFS=- '/^server-port-/{$NF++} 1' config.txt 

这会生成新文件:

$ cat config.txt
server-port-1001
server-online=true
level-name-Hapos
type=XZC

使用最新的 GNU awk 以外的 awk:

$ awk -F- -v OFS=- '/^server-port-/{$NF++} 1' config.txt >tmp$$ && mv tmp$$ config.txt
$ cat config.txt
server-port-1002
server-online=true
level-name-Hapos
type=XZC

关于非 GNU 解决方案的安全和临时文件的说明

使用非 GNU awk 就地更新需要创建一个临时文件。将临时文件放在 /tmp 中是很常见的,但这是一个安全风险:其他用户可以写入此目录,从而使竞争条件成为可能。通过使用诸如 mktemp 之类的实用程序可以将这种危险降到最低,该实用程序会生成难以猜测的文件名。更好的解决方案是将 tmp 文件放在只有用户具有写入权限的目录中。这可以是主目录。

上面的tmp文件和config.txt文件放在同一个目录下。这个目录很可能是安全的,因为它是 config.txt 所在的位置。如果不是,则应采取措施。

有关此问题的详细信息,请参阅 Greg's FAQ 062