我有另一个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。
答案 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)