如何在shell脚本中处理Perl数组元素?

时间:2010-05-26 08:19:59

标签: perl bash

例如:

Perl:

@array = (1,2,3);

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

在我的shell脚本中,如何在shell脚本中处理这个数组?如何处理shell脚本以接收参数,以及如何在shell脚本中使用该数组变量?

4 个答案:

答案 0 :(得分:5)

此:

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

等同于shell命令:

/tmp/a.sh 1 2 3

您可以通过简单地打印出传递给系统的内容来看到这一点:

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

a.sh应像处理任何其他shell参数一样处理它们。

为安全起见,您应绕过shell并直接将数组作为参数传递:

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个参数。

可以找到有关在shell程序中处理参数的简短教程here

无论如何,为什么要在Perl中编写一个程序,在shell中编写一个程序?它增加了使用两种语言的复杂性,shell没有调试器。用Perl写它们。更好的是,将它作为Perl程序中的函数编写。

答案 1 :(得分:2)

shell脚本在$@

中接收其参数
#!/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

答案 2 :(得分:1)

像这样:

Perl中的

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

(a.sh):

#!/bin/sh
i=1;
while test "$1"
do
    echo argument number $i = $1
    shift
    i=`expr $i + 1`
done

答案 3 :(得分:-2)

如果要传递所有数组元素一次:

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");
}