在Perl文档中,perlrun(1)建议使用双语shell / Perl标头启动Perl脚本:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
什么${1+"$@"}
意思 我尝试使用"$@"
代替(使用Bash作为/ bin / sh),它似乎同样有效。
编辑
以下两个答案说应该是${1:+"$@"}
。我知道${parameter:+word}
bash(1)中记录了(“使用替代值”)语法。但是,我不敢相信,因为
无论
${1+"$@"}
和"$@"
工作得很好,即使在没有参数。如果我创建simple.sh为#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
和question.sh为
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
我可以使两者相同地工作:
$ ./question.sh $VAR1 = []; $ ./question.sh a $VAR1 = [ 'a' ]; $ ./question.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./question.sh "" $VAR1 = [ '' ]; $ ./simple.sh $VAR1 = []; $ ./simple.sh a $VAR1 = [ 'a' ]; $ ./simple.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./simple.sh "" $VAR1 = [ '' ];
Internet上的其他来源也可以使用
${1+"$@"}
,包括一名黑客似乎知道他在做什么。
也许${parameter+word}
是未记录的替代(或不推荐使用)语法${parameter:+word}
?有人可以确认这个假设吗?