【问题标题】:BASH: getopts with default parameters valueBASH:具有默认参数值的 getopts
【发布时间】: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。

【问题讨论】:

    标签: bash parameters default getopts


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2019-05-15
      • 1970-01-01
      • 2019-10-16
      • 2016-10-30
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      相关资源
      最近更新 更多