我无法将问号字符传递给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问题
更新:既然已经回答了这个问题,我突然意识到:这是大多数命令行参数在他们面前冲刺的原因吗?
答案 0 :(得分:10)
您在运行脚本的目录中有一个名为t
的文件。 shell将问号(?
)视为单个字符,并在将参数传递给脚本之前对其进行扩展。例如,如果您有一个名为xx
的文件,那么使用??
运行您的脚本将打印“xx”。
如果您引用脚本的参数,则不会发生shell扩展,并且传递?
或*
或??
仍未解释。
答案 1 :(得分:3)
问号?
是一个用于全局扩展的shell元字符。它是单个字符的占位符,类似于正则表达式中的.
。例如。如果我有文件a1.txt a2.txt b1.txt
,那么glob模式a?.txt
将匹配a1.txt
和a2.txt
,但不匹配b1.txt
。
以下shell元字符在作为命令行参数的一部分时必须始终进行转义或引用:
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
有时必须转义这些字符:
* ? [ # ˜ = %
此外,符号! { } [[ ]]
是保留字。
(摘自POSIX shell language description。Bash主要与POSIX兼容。)