在Java中传递值属性文件的Shell脚本

时间:2019-03-15 10:27:33

标签: bash shell sh

我有一个如下所示的属性文件:

mysql.username=USERNAME
mysql.pass=PASS

我需要使用传递到shell脚本的变量值来更改USERNAMEPASS。我无法使用sed,因为这将在第一次用“值”替换USERNAME和PASS时正常工作,但是一旦替换它们,sed将在第二次运行脚本时在文件中找不到变量名,因此问题。

如何处理?

1 个答案:

答案 0 :(得分:0)

我相信实现目标的最简单方法是始终对未修改的模板文件执行替换,而不是尝试对生成的文件的先前版本进行操作:

# produce a first version of the file.properties 
sed -e 's/USERNAME/user1/' -e 's/PASS/pass1/' file.properties.template > file.properties

# succesfully produce a second version of the file.properties
sed -e 's/USERNAME/user2/' -e 's/PASS/pass2/' file.properties.template > file.properties

另一种替代方法是更改​​脚本的输入(或代码?),以便您的搜索和替换操作不基于占位符值,而是基于属性名:

$ cat test.sh
#!/bin/bash

target=$1
shift

while key=$1 && value=$2 && shift 2; do
    sed -i "s/^$key=.*/$key=$value/" $target
done

$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=USERNAME
mysql.pass=PASS

$ ./test.sh test.props mysql.username sa mysql.pass clearTextPasswordsAreTerrible

$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=sa
mysql.pass=clearTextPasswordsAreTerrible

$ ./test.sh test.props mysql.username secondTry mysql.pass successfullyModified

$ cat test.props
mysql.hostname=HOSTNAME
mysql.username=secondTry
mysql.pass=successfullyModified