如何在zsh / shell脚本中解析问号作为参数?

时间:2017-08-13 14:53:36

标签: 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 else…
        ;;
esac

传递--help-h有效。但是,当我将-?传递给它时,它会因错误而失败:

  

zsh:找不到匹配项: - ?

现在即使使用简单的if循环也失败了:

if [ "$1" = "-?" ]; then
    show_help
    exit
fi

请注意,传递"-?"'-?'有效,但这很愚蠢,没有人这样做。

我也无法在bash中重现这一点,只能在zsh中重现。

2 个答案:

答案 0 :(得分:2)

具有-?帮助选项的程序示例为less。很久以前,如果你没有参数运行它,就会说

Missing filename ("less -\?" for help)

因为-?本身很脆弱。在与Bourne / Korn / POSIX兼容的shell中,它具有不同的行为,具体取决于当前目录中是否存在名称中包含2个字符且-作为第一个字符的文件。

它不再说,因为-\?是一个愚蠢的帮助选项。现在它说

Missing filename ("less --help" for help)

(如果没有为其他目的而采取-h,肯定会这样做。

less -\?仍然会像往常一样显示帮助,但不鼓励任何人使用它。

请遵循此示例。

答案 1 :(得分:1)

问号符号可能会解析为返回上次执行的命令的值。无论如何,用反斜杠保护它" \"应该防止将其解释为其他任何东西。

#!/bin/zsh
# […]
case "$1" in
    '' ) # no parameters
        echo "something missing here"
    ;;
    --help|-\?|-h ) # show help message
        show_help
        exit
        ;;
    *)
        # do something else…
        ;;
esac