我正在尝试创建一个bash脚本来读取samba配置,循环遍历不同的“部分”并在设置变量时执行
以下是配置示例:
[global]
workgroup = METRAN
encrypt passwords = yes
wins support = yes
log level = 1
max log size = 1000
read only = no
[homes]
browsable = no
map archive = yes
[printers]
path = /var/tmp
printable = yes
min print space = 2000
[music]
browsable = yes
read only = yes
path = /usr/local/samba/tmp
[pictures]
browsable = yes
read only = yes
path = /usr/local/samba/tmp
force user = www-data
这就是我想要做的事情(我知道这种语法是一种真正的语言,但它应该给你一个想法:
#!/bin/sh
#
CONFIG='/etc/samba/smb.conf'
sections = magicto $CONFIG #array of sections
foreach $sections as $sectionname #loop through the sections
if $sectionname != ("homes" or "global" or "printers")
if $force_user is-set
do something with $sectionname and with $force_user
endif
else
do something with $sectionname
endelse
endif
endforeach
答案 0 :(得分:1)
这将读取每个部分并获得键值对。
#!/bin/bash
CONFIG='/etc/samba/smb.conf'
for i in homes music; do
echo "$i"
sed -n '/\['$i'\]/,/\[/{/^\[.*$/!p}' $CONFIG | while read -r line; do
printf "%-15s : %s\n" "${line%?=*}" "${line#*=?}"
done
done
<强>输出强>
homes
browsable : no
map archive : yes
music
browsable : yes
read only : yes
path : /usr/local/samba/tmp
<强>解释强>
sed -n '/\['$i'\]/,/\[/{/^\[.*$/!p}'
1)/\['$i'\]/,/\[/
匹配[]
到下一个[
2){/^\[.*$/!p}
匹配行^
的开头,后跟[
和零个或多个字符.*
,直到行结束$
,如果匹配则不匹配't print !p
${line%?=*}
从结尾(右)修剪字符串,直到第一个=
和任何字符?
${line#*=?}
修剪字符串从开头(左)到第一个=
和任何字符?
答案 1 :(得分:0)
使用Perl:
use strict;
use warnings;
sub read_conf {
my $conf_filename = shift;
my $section;
my %config;
open my $cfile, "<", $conf_filename or die ("open '$conf_filename': $!");
while (<$cfile>) {
chomp;
if (/^\[([^]]+)]/) {
$section = $1;
} else {
my ($k, $v) = split (/\s*=\s*/);
$k =~ s/^\s*//;
$config{$section}{$k} = $v;
}
}
close $cfile;
return \%config;
}
sub main {
my $conf_filename = '/etc/samba/smb.conf';
my $conf = read_conf($conf_filename);
foreach my $section (grep { !/homes/ and !/global/ and !/printers/} keys %$conf) {
print "do something with: $section\n";
foreach my $key (keys %{$conf->{$section}}) {
my $val = $conf->{$section}{$key};
print "$key is $val in $section\n";
}
}
}
main;
答案 2 :(得分:0)
如果您对Perl感到满意,可以查看Config :: Std
http://metacpan.org/pod/Config::Std
对此问题的致意:How can I find all matches to a regular expression in Perl?