Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在shell脚本中处理Perl数组元素?_Perl_Bash - Fatal编程技术网

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

如何在shell脚本中处理Perl数组元素?,perl,bash,Perl,Bash,例如: 在Perl中: @array = (1,2,3); system ("/tmp/a.sh @array" ); 在我的shell脚本中,如何在shell脚本中处理这个数组?如何处理shell脚本以接收参数,以及如何在shell脚本中使用该数组变量?如下所示: 在Perl中: @a=qw/aa bb cc/; system("a.sh ".join(' ',@a)); 在shell(a.sh)中: 如果要一次性传递所有数组元素: my @array = qw(1 2 3

例如:

在Perl中:

@array = (1,2,3);

system ("/tmp/a.sh @array" ); 
在我的shell脚本中,如何在shell脚本中处理这个数组?如何处理shell脚本以接收参数,以及如何在shell脚本中使用该数组变量?

如下所示:

在Perl中:

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


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

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

相当于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程序中处理参数的简短教程


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

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

你必须提供更多的细节。你说的“把手”是什么意思?您希望shell脚本接收什么作为参数?我不知道如何接收perl数组参数要将所有数组元素传递给bash脚本吗?是的。我想将所有元素传递到bash script中如何在shell脚本中处理此数组变量?除非有人弄乱了
$”
“@array”
相当于
join(“,@array”)
你不需要这个连接,你应该使用列表形式的system。最好使用Perl系统的列表形式。你可以说
system('a.sh',@a)
最好使用
system
的列表形式,除非您确实需要参数的shell插值。在这种情况下,最好设计您的代码,使您不需要它,并且可以使用
system
的列表形式。当存在其他“特殊”参数时,作为单独的参数传递给系统是否也有帮助“像引号一样的字符?我现在有一个系统调用,它只是转义要作为单个字符串传递给系统的所有特殊字符,但我想知道作为不同的参数传递给system()是否会使它在没有转义的情况下工作。@Herms:是的,通过传递数组而不是单个字符串,您不必“转义”或引用参数。
#!/bin/sh
# also works for Bash
for arg  # "in $@" is implied
do
    echo "$arg"
done
#!/bin/bash
echo "${@:2:1}"    # second argument
args=($@)
echo "${args[2]}"  # second argument
echo "${@: -1}"    # last argument
echo "${@:$#}"     # last argument