Trong tài liệu Perl, perlrun (1) đề xuất khởi chạy các tập lệnh Perl bằng cách sử dụng tiêu đề shell / Perl song ngữ:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
Có ${1+"$@"}
nghĩa là gì? Tôi đã thử sử dụng "$@"
thay thế (sử dụng Bash as / bin / sh) và dường như nó cũng hoạt động tốt.
Biên tập
Hai câu trả lời dưới đây nói rằng nó được cho là như vậy ${1:+"$@"}
. Tôi biết ${parameter:+word}
cú pháp ("Sử dụng giá trị thay thế") được ghi lại trong bash (1). Tuy nhiên, tôi không tin, bởi vì
Cả hai
${1+"$@"}
và"$@"
hoạt động tốt, ngay cả khi không có tham số. Nếu tôi tạo Simple.sh như#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
và question.sh như
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Tôi có thể khiến cả hai làm việc giống hệt nhau:
$ ./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 = [ '' ];
Các nguồn khác trên Internet cũng sử dụng
${1+"$@"}
, bao gồm một hacker dường như biết anh ta đang làm gì.
Có lẽ ${parameter+word}
là một cú pháp thay thế (hoặc không dùng nữa) không có giấy tờ cho ${parameter:+word}
? Ai đó có thể xác nhận giả thuyết đó?