Как я могу обработать элемент массива Perl в сценарии оболочки? - PullRequest
2 голосов
/ 26 мая 2010

Например:

В Perl:

@array = (1,2,3);

system ("/tmp/a.sh @array" ); 

Как мне обработать этот массив в сценарии оболочки в моем сценарии оболочки? Как обработать сценарий оболочки для получения аргументов и как использовать эту переменную массива в сценарии оболочки?

Ответы [ 4 ]

5 голосов
/ 26 мая 2010

Это:

my @array = (1,2,3);   
system ("/tmp/a.sh @array" );

эквивалентно команде оболочки:

/tmp/a.sh 1 2 3

это можно увидеть, просто распечатав то, что вы передаете системе:

print "/tmp/a.sh @array";

a.sh должен обрабатывать их как любой другой набор аргументов оболочки.

Чтобы быть в безопасности, вы должны обойти оболочку и передать массив в качестве аргументов напрямую:

system "/tmp/a.sh", @array;

При этом каждый элемент @array передается как отдельный аргумент, а не как строка, разделенная пробелом. Это важно, если значения в @array содержат пробелы, например:

my @array = ("Hello, world", "This is one argument");
system "./count_args.sh @array";
system "./count_args.sh", @array;

, где count_args.sh:

#!/bin/sh

echo "$# arguments"

вы увидите, что в первом он получает 6 аргументов, а во втором - 2.

Краткое руководство по обработке аргументов в программе оболочки можно найти здесь .

В любом случае, зачем писать одну программу на Perl и одну в оболочке? Это усложняет использование двух языков, и в оболочке нет отладчика. Напишите их оба на Perl. А еще лучше напишите это как функцию в программе Perl.

2 голосов
/ 26 мая 2010

Сценарий оболочки получает свои аргументы в $@:

#!/bin/sh
# also works for Bash
for arg  # "in $@" is implied
do
    echo "$arg"
done

В Bash к ним также можно получить доступ через индексы массива или нарезку:

#!/bin/bash
echo "${@:2:1}"    # second argument
args=($@)
echo "${args[2]}"  # second argument
echo "${@: -1}"    # last argument
echo "${@:$#}"     # last argument
1 голос
/ 26 мая 2010

как это:

в Perl:

   @a=qw/aa bb cc/;
   system("a.sh ".join(' ',@a));

в оболочке (a.sh):

#!/bin/sh
i=1;
while test "$1"
do
    echo argument number $i = $1
    shift
    i=`expr $i + 1`
done
0 голосов
/ 26 мая 2010

, если вы хотите передать все элементы массива один раз:

my @array = qw(1 2 3);

system("/tmp/a.sh". join(" ", @array));

Если вы хотите передать элементы массива один за другим:

my @array = qw(1 2 3);
foreach my $arr (@array) {
     system("/tmp/a.sh $arr");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...