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的主要内容,如果未能解决你的问题,请参考以下文章