【问题标题】:Getopts default case bash scriptGetopts 默认案例 bash 脚本
【发布时间】:2019-10-16 12:19:06
【问题描述】:

我想使用 getopts 但默认情况下不起作用。

我试过的代码是:

while getopts "sdp" arg; do
case "$arg" in
s) 
    echo "1" 
;;
p)
    echo "2" 
;;
d) 
   echo "3" 
;;
*) 
   echo "default"
;;
esac

当我运行进程时:./myTask

我没有收到任何输出

【问题讨论】:

  • 那么问题是什么。你想要什么?
  • 默认情况下不起作用。
  • getopts 返回零状态,while 循环从未执行,因此“默认情况”从未执行。
  • 这是case 语句的默认值,但它意味着getopts 上下文中的特定内容:您定义了一个选项但没有处理它的子句。请在我的回答here 中查看getopts 函数的参考实现。

标签: linux bash switch-statement getopts


【解决方案1】:

它按预期工作。

默认情况不是处理你没有参数的情况,而是你提供无效参数的情况:

$ ./myTest -X
./myTest: illegal option -- X
default

通常你会在这种情况下写一个使用信息。

【讨论】:

    【解决方案2】:

    这是case 语句的默认值,但它意味着getopts 上下文中的特定内容:您定义了一个选项但没有处理它的子句。

    例如,如果您运行./myTask -z,您将在此处的另一个答案中看到@that_other_guy 状态的“默认”输出。

    如果你想输出一些表明没有提供选项的东西:

    然后在while getopts 块之后但在shift $(($OPTIND - 1)) 行之前,执行此操作(在if 块内进行任何您想要的处理:

    if ((OPTIND == 1))
    then
        echo "No options specified"
    fi
    

    请注意,这并不表示未指定 参数(例如,./myTask 与您的问题一样)。为此,请在shift 行之后添加此

    if (($# == 0))
    then
        echo "No positional arguments specified"
    fi
    

    请在我的回答here 中查看getopts 函数的参考实现。

    【讨论】: