Как получить возвращаемое значение при вызове perl sub из bash скрипта? - PullRequest
1 голос
/ 29 мая 2020

Я вызываю сценарий perl из сценария bash. Я хочу получить возвращаемое значение, которое сценарий perl возвращает в сценарии bash, чтобы действовать в соответствии с ним. Когда у меня есть следующее, вывод на консоль представляет собой пустую строку, когда я ожидаю, что он будет "хорошим".

bashThing. sh

#!/bin/bash

ARG="valid"
VAL=$(perl -I. -MperlThing -e "perlThing::isValid ${ARG}")
echo $VAL

perlThing.pm

#! /usr/bin/perl -w
use strict;

package perlThing;

sub isValid
{
  my $arg = shift;
  if($arg == "valid")
  {
    return "good";
  }
  else
  {
    return "bad";
  }
}

1;

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Если вы ожидаете значение good или bad в $VAR, тогда вы должны print их, а не return их.

Кроме print ed, perl процесс может передавать вызывающей программе только целые return значения. И вы можете проверить это, используя $? в bash скрипте, эта переменная хранит значение return последнего запущенного процесса.

2 голосов
/ 29 мая 2020

У вас не было полностью включено Perl warnings. Вы бы увидели несколько предупреждений. Я включил предупреждения как в bash (используя -w в однострочном Perl), так и в Perl с use warnings;. Строка shebang игнорируется в файле .pm, поскольку она не выполняется как сценарий.

isValid вернул строку, но вы проигнорировали возвращенное значение. Чтобы исправить это, используйте print в однострочном тексте.

Вам также необходимо правильно передать значение isValid.

Наконец, вам нужно использовать eq вместо == для сравнения строк.

bash:

#!/bin/bash

ARG="valid"
VAL=$(perl -w -I. -MperlThing -e "print perlThing::isValid(q(${ARG}))")
echo $VAL

Perl:

use strict;
use warnings;

package perlThing;

sub isValid
{
  my $arg = shift;
  if($arg eq "valid")
  {
    return "good";
  }
  else
  {
    return "bad";
  }
}

1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...