Perl:不能将问号作为命令行参数传递

时间:2017-10-07 13:27:48

标签: bash perl

我无法将问号字符传递给Perl脚本。它出现在字母" t"代替。

./myscript foo
print $ARGV[0]; # prints foo

./myscript ?
print $ARGV[0]; # prints t

./myscript "?"
print $ARGV[0]; # prints ?

./myscript ??
print $ARGV[0]; # prints ?? (multiple question marks work)

./myscript ^
print $ARGV[0]; # prints ^; other special characters work too

./myscript foo?
print $ARGV[0]; # prints foo?

我无法在任何地方找到解释。我想传递问号的原因是我的脚本有一个简单的帮助选项。其他特殊字符也起作用,引用问号也是如此,问号与另一个字符串混合在一起。它只是一个单一的,没有问题的裸体问号。

我通过Bash shell调用脚本。我不是100%肯定这是一个Perl问题

更新:既然已经回答了这个问题,我突然意识到:这是大多数命令行参数在他们面前冲刺的原因吗?

2 个答案:

答案 0 :(得分:10)

您在运行脚本的目录中有一个名为t的文件。 shell将问号(?)视为单个字符,并在将参数传递给脚本之前对其进行扩展。例如,如果您有一个名为xx的文件,那么使用??运行您的脚本将打印“xx”。

如果您引用脚本的参数,则不会发生shell扩展,并且传递?*??仍未解释。

答案 1 :(得分:3)

问号?是一个用于全局扩展的shell元字符。它是单个字符的占位符,类似于正则表达式中的.。例如。如果我有文件a1.txt a2.txt b1.txt,那么glob模式a?.txt将匹配a1.txta2.txt,但不匹配b1.txt

以下shell元字符在作为命令行参数的一部分时必须始终进行转义或引用:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

有时必须转义这些字符:

*   ?   [   #   ˜   =   %

此外,符号! { } [[ ]]是保留字。

(摘自POSIX shell language description。Bash主要与POSIX兼容。)