我有一个 .conf 文件,另一个脚本读取它只包含变量,实际上目前只有这三个。
pass=blahblahblah
port=number
user=someusername
如何编写一个脚本来更改/替换/重写 .conf 文件中的变量?我之前以不同的形式问过这个问题,并因此而被关闭。这是我很陌生的事情,在开始为我完成这样的任务之前可能会很困惑。这是我拼图的最后一块。
谢谢,任何帮助表示赞赏。
将值放入变量后,您可以使用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
要为要更改的每个变量更改文件中的变量,您需要这样的一行
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 到它的值
我明白了,所以这就是您创建基本提示的方式,它将替换文件中变量的值。
#! /system/bin/bash
read -p "Enter newpass: " NEWPASS
sed -i -e"s/^pass=.*/pass=$NEWPASS/" /etc/file.conf
我跑了:
cat /etc/file.conf
& 果然文件中的值已更改。感谢所有帮助过的人,没有你们我做不到。