在我的配置文件中增加我的服务器端口
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。
我想制作一个 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。