我想制作一个Bash脚本,如果我运行我的脚本,每次都会增加我的Config文件中的服务器端口选项+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
答案 0 :(得分:2)
让我们从这个配置文件开始:
$ cat config.txt
server-port=1000
server-online=true
level-name=Hapos
type=XZC
我们可以使用awk增加端口:
$ awk -F= -v OFS== '$1 == "server-port"{$2++} 1' config.txt
server-port=1001
server-online=true
level-name=Hapos
type=XZC
代码的工作原理如下:
-F=
将输入的字段分隔符设置为=
。
-v OFS==
将输出中的字段分隔符设置为=
。
$1 == "server-port"{$2++}
测试第一个字段是否为server-port
。如果是,则递增第二个字段。
1
是awk用于打印线的神秘简写。
$ awk -i inplace -F= -v OFS== '$1 == "server-port"{$2++} 1' config.txt
$ cat config.txt
server-port=1001
server-online=true
level-name=Hapos
type=XZC
$ awk -i inplace -F= -v OFS== '$1 == "server-port"{$2++} 1' config.txt
$ cat config.txt
server-port=1002
server-online=true
level-name=Hapos
type=XZC
$ awk -F= -v OFS== '$1 == "server-port"{$2++} 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
使用awk而不是最新的GNU 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 awk进行就地更新需要创建一个临时文件。将临时文件放在/tmp
中是很常见的,但这存在安全风险:其他用户可以写入此目录,从而使竞争条件成为可能。使用诸如mktemp
之类的实用程序可以最大限度地减少这种危险,这种实用程序会产生难以猜测的文件名。更好的解决方案是将tmp文件放在只有用户具有写访问权限的目录中。这可以是主目录。
在上面,tmp文件与config.txt文件放在同一目录中。这个目录很可能是安全的,因为它是config.txt所在的位置。如果不是,则应采取措施。
有关此问题的详细信息,请参阅Greg's FAQ 062。