Передать текст в PERL-скрипт

Рейтинг: 0Ответов: 2Опубликовано: 27.01.2015

Всем привет. Такая проблема: Есть perl-скрипт, в который можно передать данные из консоли:

./postinst.pl --nowizard --server=http://mysite.com --configdir=/etc/ocsinventory-agent --user=client --pass=feofh08f02jf2 --realm=OCS Inventory agent area --crontab --remove-old-linux-agent --debug --nossl --download --now

Но проблема в том, что в параметр --realm я подаю текст с пробелами, а он берет лишь первое слово, в итоге в конфиг записывает так:

realm=OCS

Как передать параметр так, чтобы взялась вся строка, а не только первое слово? (В кавычки брал - вообще пропускает этот параметр)

Если нельзя так передать, то как поменять сам PERL-скрипт? Сейчас он такой:

 }elsif($option=~/--realm=(\S*)$/){
$config->{realm} = $1;

Ответы

▲ 1Принят

Печально, конечно, что обработка параметров сделана "вручную". Есть же стандартные либы, та же Getopt.

Но раз так написано, то значит передаем правильно, экранируя пробелы. Где-то так:

--realm=OCS\ Inventory\ agent\ area

Также в коде нужно сделать небольшую модификацию.

Поменяйте эту строку

$option=~/--realm=(\S*)$/

на такую

$option=~/--realm=(.*)$/)

После этого будет работать и в кавычках, и в двойных, и со слешами.

▲ 1

Дело в том что разобрать @ARGV в разных системах с разными CLI не такое простое дело. Если вы выведете @ARGV на печать то увидите что ключи уже сформированы совсем не так как вы ожидали. Почитайте тот-же Getopt::Long

Для корректной работы нужно "подготовить" @ARGV. Как вариант:

    foreach my $param (@ARGV) {
        if ( $param =~ /^-/ ){
                if ( $param =~ /=/ ) {
                        ( $key, $value ) = split '=', $param;
                        $newArgv{$key} = $value;
                }else{
                        $newArgv{$param}++;
                }
        }else{
                $newArgv{$key} .= " $param";
        }

}
@ARGV = ();
for ( keys %newArgv ) {

        if ( $newArgv{$_} ){
                push ( @ARGV, $_."=".$newArgv{$_} );
        }else{
                push ( @ARGV, $_ );
        }
}

а потом уже по вкусу:

    use Getopt::Long;

GetOptions(
        "nowizard=i"         => \$nowizard,
        "server=s"         => \$server,
        "configdir=s"      => \$configdir,
        "user=s"           => \$user,
        "pass=s"           => \$pass,
        "realm=s"          => \$realm
);

print "Got values \$nowizard $nowizard \$server $server \$configdir $configdir \$user $user \$pass $pass \$realm $realm";