BASH:具有默认参数值的 getopts

Posted

技术标签:

【中文标题】BASH:具有默认参数值的 getopts【英文标题】:BASH: getopts with default parameters value 【发布时间】:2014-03-09 15:14:49 【问题描述】:

我遇到了另一个我根本无法解决的 bash 脚本问题。这是我显示问题的简化脚本:

while getopts "r:" opt; do
case $opt in

  r)
    fold=/dev
    dir=$2:-fold

     a=`find $dir -type b | wc -l`
     echo "$a"
  ;;
esac
done

我叫它:

  ./sc.sh -r /bin

它可以工作,但是当我不提供参数时它不起作用:

  ./sc.sh -r

我希望 /dev 成为此脚本中的默认参数 $2。

【问题讨论】:

【参考方案1】:

这对我有用:

#!/bin/bash

while getopts "r" opt; do
case $opt in

  r)
    fold=/dev
    dir=$2:-$fold

     echo "asdasd"
  ;;
esac
done

删除 getopts 参数中的冒号 (:)。这导致 getopt 期待一个论点。 (有关 getopt 的更多信息,请参阅here)

【讨论】:

我以前试过这个。当我在没有参数的情况下调用它时仍然不起作用:./sc.sh -r /// 错误:./sc.sh: option requires an argument -- r 你能帮我解决同样的问题,但使用条件语句“if”。它也返回一个错误。代码如下所示: if [ $1 != -r ];然后 fold=/dev dir=$1:-$fold a=find $dir -type b | wc -l echo "$a" fi 好的,我刚得到这个 ([[ $1 != -r ]])!不要打扰,提前感谢您的帮助。【参考方案2】:

前面可能还有其他参数,不要硬编码参数号($2)。

getopts 帮助说

当一个选项需要一个参数时,getopts 将该参数放入 shell 变量 OPTARG。 ... [在静默错误报告模式下,] 如果一个 未找到所需的参数,getopts 将 ':' 放入 NAME 和 将 OPTARG 设置为找到的选项字符。

所以你想要:

dir=/dev                            # the default value
while getopts ":r:" opt; do         # note the leading colon
    case $opt in
        r) dir=$OPTARG ;;
        :) if [[ $OPTARG == "r" ]]; then
               # -r with required argument missing.
               # we already have a default "dir" value, so ignore this error
               :
           fi
           ;;
    esac
done
shift $((OPTIND-1))

a=$(find "$dir" -type b | wc -l)
echo "$a"

【讨论】:

以上是关于BASH:具有默认参数值的 getopts的主要内容,如果未能解决你的问题,请参考以下文章

具有默认参数值的打字稿条件返回类型

Bash getopts:识别否定选项(-x- 或 +x)?

区分具有默认值的 &optional 参数和无值

具有多个强制性选项的 bash getopts

使用 getopts (bash) 的多个选项参数

InjectMocks 不适用于具有默认值的 Kotlin 构造函数参数