我有一个.conf文件,其他脚本只读取变量,实际上目前只有这三个。
pass=blahblahblah
port=number
user=someusername
如何编写一个脚本来更改/替换/重写.conf文件中的变量?我早些时候以不同的形式问过这个问题,有点因此而关闭。这是我非常新的事情。在开始为我完成这样的任务之前,它可能会非常混乱。这是我拼图的最后一块。
谢谢你,&任何帮助表示赞赏。
答案 0 :(得分: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
选项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
答案 1 :(得分: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
read
。 http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-10.html
pass="blahblah"
read tmp_pass
[ "$tmp_pass" == "" ] || pass=$tmp_pass
如果他们只是点击进入他们tmp_pass将为空,但如果它不为空它将最终设置传递给它的值
答案 2 :(得分:0)
我知道了,所以这就是你如何创建一个基本提示,它将取代文件中变量的值。
#! /system/bin/bash
read -p "Enter newpass: " NEWPASS
sed -i -e"s/^pass=.*/pass=$NEWPASS/" /etc/file.conf
我跑了:
cat /etc/file.conf
&安培;确定文件中的值已更改。感谢所有帮助过的人,没有你,我无法做到。