例如:
Perl:
@array = (1,2,3);
system ("/tmp/a.sh @array" );
在我的shell脚本中,如何在shell脚本中处理这个数组?如何处理shell脚本以接收参数,以及如何在shell脚本中使用该数组变量?
答案 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)
:
@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");
}