Я недавно записал сценарий для работы, которая была универсальна и допускала несколько видов переключателей в любом порядке. Я не могу раскрыть полный сценарий по очевидным легальным причинам (не говоря уже о, у меня нет его со мной в данный момент), но вот суть его.. можно поместить его в подпрограмму и назвать его в конце сценария:
options () {
if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
while (( "$#" )); do # process ALL arguments
if [ "$1" = ^-t$ ]; then # -t short for "test"
# do something here THEN shift the argument
# shift removes it from $@ and reduces $# by
# one if you supply no argument
shift
# we can also process multiple arguments at once
elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
# do something more then remove them ALL from the arg list
shift 3
else
echo "No matching arguments!"
echo "Usage: [script options list here]"
fi
done
else
echo "Usage: [script options list here]"
exit 0
fi
}
options "$@" # run options and loop through/process ALL arguments
Я действительно рекомендую ограничить Ваш сценарий удара меньше чем 400 lines/15k символами; мой вышеупомянутый сценарий вырос мимо этого размера и стал значительно трудным продолжить работать. Я начал переписывать его в Perl, который намного лучше подходит для задачи. Имейте это в виду, поскольку Вы работаете над своими сценариями в ударе. Bash является большим для маленьких сценариев и острот, но что-либо более сложное и Вы являетесь более обеспеченной записью его в Perl.
Отметьте, у меня нет тестового вышеупомянутого, таким образом, оно, вероятно, не работает, но Вы в общих чертах понимаете от него.
Каждый раз, когда сталкивающийся с проблемой обработки текста, некоторые люди говорят, “давайте использовать awk”. Как правило, у них есть решение.
awk '
/^\[.*\]$/ {group = $0}
group == "[group1]" && $1 == "MyParameter" {found=1; exit}
END {exit !found}
'
С GNU sed
можно сделать
sed -n '/\[group1\]/,/\[group2\]/{/MyParameter/p}' input-file
это запишет MyParameter
только, когда это находится в group1
раздел. Если раздел после group1
не всегда group2
, можно занять место group2
с .*
.
/^MyParameter&/
разрешит встроенное соответствие шаблона (например, MyParameters)
– Peter.O
06.11.2011, 10:07
Вот сценарий Perl, который должен сделать задание:
#!/usr/bin/perl
use strict;
use warnings;
die "Usage: $0 group pattern [file...]\n" if scalar @ARGV < 2;
my $group = shift;
my $pattern = shift;
my $curr_group = undef;
my $matched = 0;
while (<>) {
if (/^\[(.*)\]/) {
$curr_group = $1;
}
else {
if (defined $curr_group and
$curr_group eq $group and
/$pattern/)
{
print "Match\n";
$matched = 1;
}
}
}
if (not $matched) {
print "No match\n";
}
if [ `egrep 'MyParameter|^\[.*\]$' file.conf | head -2 | tail -1` == "MyParameter" ]
then
echo Success
else
echo Failure
fi
[group1]
первая группа, иначе она возвращает Отказ.. Интересно, было ли это намерением вопроса?
– Peter.O
06.11.2011, 10:08
found
к 1. В конце это выходит с соответствующим кодом состояния (0, если параметрический усилитель был найден в корректной группе). – Axel Knauf 05.11.2011, 18:16