将用户输入写入文件BASH中的值变量

时间:2013-10-20 04:02:34

标签: bash shell

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

    pass=blahblahblah
    port=number 
    user=someusername

如何编写一个脚本来更改/替换/重写.conf文件中的变量?我早些时候以不同的形式问过这个问题,有点因此而关闭。这是我非常新的事情。在开始为我完成这样的任务之前,它可能会非常混乱。这是我拼图的最后一块。

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

3 个答案:

答案 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

下面的哎呀是一个错过理解,但可能会回答未来访客的问题标题 在bash中使用readhttp://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 

&安培;确定文件中的值已更改。感谢所有帮助过的人,没有你,我无法做到。