Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在zsh/shell脚本中将问号解析为参数?_Linux_Shell_Zsh - Fatal编程技术网

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-\?
,可能)。