Linux 如何在zsh/shell脚本中将问号解析为参数?
参数Linux 如何在zsh/shell脚本中将问号解析为参数?,linux,shell,zsh,Linux,Shell,Zsh,参数--help、-h或-?用于显示有关如何使用程序/脚本的信息 所以我们可以这样分析它们: #!/bin/sh # […] case "$1" in '' ) # no parameters echo "something missing here" --help|-?|-h ) # show help message show_help exit ;; *) # do something
--help
、-h
或-?
用于显示有关如何使用程序/脚本的信息
所以我们可以这样分析它们:
#!/bin/sh
# […]
case "$1" in
'' ) # no parameters
echo "something missing here"
--help|-?|-h ) # show help message
show_help
exit
;;
*)
# do something else…
;;
esac
传递--help
和-h
有效。但是,当我将-?
传递给它时,它会失败并出现错误:
zsh:未找到匹配项:-
现在,即使使用简单的if循环失败:
if [ "$1" = "-?" ]; then
show_help
exit
fi
请注意,传递“-?”
或“-?”
是有效的,但这很愚蠢,没有人这样做
我也无法在bash中重现这一点,只能在zsh中重现。可能,问号符号解析为返回最后执行的命令的值。无论如何,用反斜杠“\”来保护它应该可以防止将其解释为任何其他内容
#!/bin/zsh
# […]
case "$1" in
'' ) # no parameters
echo "something missing here"
;;
--help|-\?|-h ) # show help message
show_help
exit
;;
*)
# do something else…
;;
esac
带有
-?
帮助选项的程序示例为less
。很久以前,如果你不带任何理由运行它,它会说
Missing filename ("less -\?" for help)
因为-?
本身是脆弱的。在与Bourne/Korn/POSIX兼容的shell中,根据当前目录中是否存在名称为2个字符且第一个字符为-
的文件,它具有不同的行为
它不再这么说了,因为-\?
是一个愚蠢的帮助选项。现在它说
Missing filename ("less --help" for help)
(如果不是出于其他目的,它肯定会随-h
一起消失)
less-\?
仍然像往常一样显示帮助,但不鼓励任何人使用它
遵循这个例子。我不认为
-?
是非常普遍的,我从未见过它-h
和--help
应该足够了。Windows系统使用-?
或更常见的/?
。如果您需要正确工作,人们会使用“-?”
。问题与您的脚本无关。在交互式zsh提示符下键入/myscript-?
时,zsh根本不会调用脚本,而是发出错误。这与特殊参数?
(其值通过$?
访问)无关。大小写表达式是模式,因此-?
是一种模式,它匹配后跟任何单个字符的文本-
。不过,解决方案是正确的;转义?
可以防止它充当元字符,并允许它匹配文字问号?(在脚本中)没有帮助。正如其他人所说的,zsh甚至不执行脚本,因此您将不得不逃避?运行命令时(/script-\?
,可能)。