Bash - 读取配置文件并在此文件中进行更改
Bash - Read config files and make changes in this file
我有这样的配置文件,例如:
# Blah blah, this is sample config file blah blah
# Something more blah blah
value1=YES
value2=something
#value3=boom
# Blah blah
valueN=4145
我想制作脚本来读取和编辑这样的配置文件。我想制作一个包含配置选项组的菜单,然后在写完一个选项后控制台输出将是这样的:
Group of funny options (pick option to change value):
1. value1=YES
2. value2=something
3. [disabled]value3=boom
例如,在选择 1 之后,我可以将值 1 从 YES 更改为 NO 或禁用并激活其他(散列取消散列)加上将新变量添加到文件末尾。然后最后保存此配置文件中的所有更改。我需要使用什么提示?实际上尝试使用 read line + awk 跳过 # 行(使用 space),但我仍然无法获取所有这些变量并在配置文件中进行更改。我会很感激你的帮助。
编辑。
while read line
do
echo $line | awk '' != "#" && / / { print }'
done < config.conf
暂时考虑这个,阅读我想要的信息。另外,我将使用类似这样的方法来更改值:
sed -c -i "s/("one" *= *).*/$two/" config.conf
我完全不知道如何将这些变量添加到我的脚本中并像我以前写的那样使用它。实际上,我是在搜索任何提示,而不是为我编写此脚本的人。我是 linux 脚本的初学者 :V
我建议不要使用这种看似通用的配置程序,因为注释可能包含有关当前值的重要信息,并且如果值发生变化,注释就会过时。
第二个问题是,我希望,如果可以激活一个条目,那么也应该可以将其停用。所以现在您有 2 个选项可以处理每个值。
第三个问题:在大多数情况下,通过值猜测类型可能有效。 YES 似乎是一个布尔值,47 是一个 int,foobar 是一个名称 - 或者它是一个文件? - 但通常也可以使用更广泛的类型,因此 YES 可以只是一个字符串或一个文件,47.3 可能有效,而 47 是或可能不是等等。
但是,对于试验和尝试,select 和 grep 可能是一个开始:
select line in $(grep "=" sample.conf) "write" "abort"
do
case $line in
"write") echo write; break ;;
"abort") echo abort; break ;;
'#'*=*) echo activate $line;;
*=[0-9]*) echo int value $line;;
*=YES|NO) echo boolean value $line;;
*) echo text value $line ;;
esac
done
而不是 'echo intvalue $line' 你可能会调用一个函数 "intconfigure" 其中只接受 int 值。对于 "write",你会写回文件,但我省略了,保留没有分配的评论并在正确的位置再次排序它们必须完成,这不是微不足道的,有机会激活或停用评论。
但是请仔细阅读 shell 中的 select 命令并尝试一下,看看你能走多远。
如果您认为您已经找到可用的解决方案,请私下将它用于所有配置文件,看看您是否更喜欢它而不是使用简单的编辑器。
我有这样的配置文件,例如:
# Blah blah, this is sample config file blah blah
# Something more blah blah
value1=YES
value2=something
#value3=boom
# Blah blah
valueN=4145
我想制作脚本来读取和编辑这样的配置文件。我想制作一个包含配置选项组的菜单,然后在写完一个选项后控制台输出将是这样的:
Group of funny options (pick option to change value):
1. value1=YES
2. value2=something
3. [disabled]value3=boom
例如,在选择 1 之后,我可以将值 1 从 YES 更改为 NO 或禁用并激活其他(散列取消散列)加上将新变量添加到文件末尾。然后最后保存此配置文件中的所有更改。我需要使用什么提示?实际上尝试使用 read line + awk 跳过 # 行(使用 space),但我仍然无法获取所有这些变量并在配置文件中进行更改。我会很感激你的帮助。
编辑。
while read line
do
echo $line | awk '' != "#" && / / { print }'
done < config.conf
暂时考虑这个,阅读我想要的信息。另外,我将使用类似这样的方法来更改值:
sed -c -i "s/("one" *= *).*/$two/" config.conf
我完全不知道如何将这些变量添加到我的脚本中并像我以前写的那样使用它。实际上,我是在搜索任何提示,而不是为我编写此脚本的人。我是 linux 脚本的初学者 :V
我建议不要使用这种看似通用的配置程序,因为注释可能包含有关当前值的重要信息,并且如果值发生变化,注释就会过时。
第二个问题是,我希望,如果可以激活一个条目,那么也应该可以将其停用。所以现在您有 2 个选项可以处理每个值。
第三个问题:在大多数情况下,通过值猜测类型可能有效。 YES 似乎是一个布尔值,47 是一个 int,foobar 是一个名称 - 或者它是一个文件? - 但通常也可以使用更广泛的类型,因此 YES 可以只是一个字符串或一个文件,47.3 可能有效,而 47 是或可能不是等等。
但是,对于试验和尝试,select 和 grep 可能是一个开始:
select line in $(grep "=" sample.conf) "write" "abort"
do
case $line in
"write") echo write; break ;;
"abort") echo abort; break ;;
'#'*=*) echo activate $line;;
*=[0-9]*) echo int value $line;;
*=YES|NO) echo boolean value $line;;
*) echo text value $line ;;
esac
done
而不是 'echo intvalue $line' 你可能会调用一个函数 "intconfigure" 其中只接受 int 值。对于 "write",你会写回文件,但我省略了,保留没有分配的评论并在正确的位置再次排序它们必须完成,这不是微不足道的,有机会激活或停用评论。
但是请仔细阅读 shell 中的 select 命令并尝试一下,看看你能走多远。
如果您认为您已经找到可用的解决方案,请私下将它用于所有配置文件,看看您是否更喜欢它而不是使用简单的编辑器。