我正在尝试创建一个 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
这将读取每个部分并获取键,值对。
#!/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 : %sn" "${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}
匹配第^
行的开头,后跟[
和零个或多个字符.*
直到第$
行的末尾,如果匹配项不打印!p
${line%?=*}
从末尾(右)到第一个=
和任何字符?
修剪字符串-
${line#*=?}
从开头(左)到第一个=
和任何字符?
修剪字符串
使用 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: $sectionn";
foreach my $key (keys %{$conf->{$section}}) {
my $val = $conf->{$section}{$key};
print "$key is $val in $sectionn";
}
}
}
main;
如果你对Perl感到满意,你可以看看Config::Std
http://metacpan.org/pod/Config::Std
这个问题的补充:如何在 Perl 中找到与正则表达式的所有匹配项?