如何在shell脚本中处理Perl数组元素?
例如: 在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
@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