1

我有一个 .conf 文件,另一个脚本读取它只包含变量,实际上目前只有这三个。

    pass=blahblahblah
    port=number 
    user=someusername

如何编写一个脚本来更改/替换/重写 .conf 文件中的变量?我之前以不同的形式问过这个问题,并因此而被关闭。这是我很陌生的事情,在开始为我完成这样的任务之前可能会很困惑。这是我拼图的最后一块。

谢谢,任何帮助表示赞赏。

4

3 回答 3

2

将值放入变量后,您可以使用sed对文件进行就地编辑,大致按照以下几行:

$ cat test.conf
pass=blahblahblah
port=number
user=someusername

$ export NEWPASS='password'

$ sed -i -e"s/^pass=.*/pass=$NEWPASS/" test.conf

$ cat test.conf
pass=password
port=number
user=someusername

根据要求更新捕获输入的 bash 脚本中的示例。由于这是一个密码,我们使用-s选项 to read,这样字符就不会回显到屏幕上。我们还有一些原始条件测试(不允许使用空密码)和错误捕获以提前终止脚本的示例。最后多余的“完成”消息是为了说明脚本确实在捕获错误时终止(防止显示最终消息,除非没有发生错误)。将传递给的文件名更改为不存在的sed文件名将触发“更改尝试失败”消息。

#!/bin/bash

read -s -p "Please specify the new password: " NEWPASS
echo ""

if test "$NEWPASS" = ""; then
        echo "$0: sorry, password cannot be blank" >&2
        exit 1;
fi

sed -i -e"s/^pass=.*/pass=$NEWPASS/" test.conf

if test $? -eq 0; then
        echo 'password changed' >&2
else
        echo 'change attempt failed' >&2
        exit 1
fi

echo "done" >&2

运行示例:

$ cat test.conf
pass=blahblahblah
port=number
user=someusername
$ ./pwchange.bash
Please specify the new password: # it wasn't echoed, but I typed 'foo'
password changed
done
$ cat test.conf
pass=foo
port=number
user=someusername
于 2013-10-20T04:21:09.097 回答
1

要为要更改的每个变量更改文件中的变量,您需要这样的一行

sed -e 's/\(^pass=\).*/\1my_new_password/' -e 's/\(^file=\).*/\1new_file_name/' /etc/file.conf 

只需更改括号内的单词以及最后 /' 之前的 \1 之后的所有内容以匹配您的情况。

将其逐部分分解
-e 意味着对 sed 's/x/y/' 执行新脚本
意味着搜索和替换,找到 x 的每一个出现并用 y 替换(尽管这会每行发生一次,除非您将其写为 ' s/x/y/g' 其中 g 代表全局
's/(x)/\1y/' 括号是反向引用找到的 x,也许 x 是某种变化的正则表达式,\1 说话关于第一组括号并将其中的内容放在那里。这将找到每次出现的 x 并将其替换为 xy
^ 表示在行首
匹配。.* 表示匹配任何字符任意次数,这使得所以该行的其余部分是“匹配的”,否则没有它和像 pass=blahblah 这样的字符串将变为 pass=new_passwordblahblah

下面的糟糕理解是一个错误的理解,但可能会为将来在 bash 中
使用的访问者回答问题的标题。http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-10.htmlread

pass="blahblah"
read tmp_pass
[ "$tmp_pass" == "" ] || pass=$tmp_pass

如果他们只是按 enter 他们 tmp_pass 将是空的,但如果它不是空的,它将最终设置 pass 到它的值

于 2013-10-20T04:06:55.217 回答
0

我明白了,所以这就是您创建基本提示的方式,它将替换文件中变量的值。

 #! /system/bin/bash

 read -p "Enter newpass: " NEWPASS

 sed -i -e"s/^pass=.*/pass=$NEWPASS/" /etc/file.conf

我跑了:

 cat /etc/file.conf 

& 果然文件中的值已更改。感谢所有帮助过的人,没有你们我做不到。

于 2013-10-20T05:43:36.627 回答