BASH:使用默认参数值的getopts

时间:2014-02-11 17:16:06

标签: bash parameters default getopts

我有另一个bash-script问题,我根本无法解决。这是我的简化脚本显示问题:

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。

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

这对我有用:

#!/bin/bash

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

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

     echo "asdasd"
  ;;
esac
done

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