Bash脚本只测试是否存在标志

时间:2017-11-01 15:29:40

标签: bash getopts

我有一个bash脚本,我需要带一个带有标志的用户名,然后我希望能够找到-r或-w来指示这应该是读还是写。

目前我正在使用get opts,但这需要将实际参数传递给-r和-w。

如何测试是否只有-r或-w而没有将某些内容传递给那些标志。

目前我的脚本如下所示:

{{1}}

2 个答案:

答案 0 :(得分:3)

如注释中所述,冒号(:)表示前面的选项字符需要参数。只需删除冒号:

#!/bin/bash
while getopts u:rw opt; do
   case $opt in
     u ) user="$OPTARG"                       ;;
     r ) my_read=1                            ;;
     w ) my_write=1                           ;;
    \? ) echo "${0##*/} [ -erw ]" >&2; exit 1 ;;
  esac
done
shift $((OPTIND-1))

if [[ "${my_write}" -eq 1 ]] ; then
    echo "write"
fi

if [[ "${my_read}" -eq 1 ]] ; then
    echo "read"
fi

进行了其他更改:最终案例中的引号移至包含方括号,输出到标准错误(>&2)以避免不恰当地管道传输,shift行已添加,因此您的参数列表({{ 1}}和$@等)删除了getopts-parsed选项,引号放在测试周围,否则shell会抱怨传递空测试(如果有变量,它会看到$1未定义,如果未传递[[ -eq 1]]-r,则会发生这种情况,而-w只会将其评估为false时无效。)

答案 1 :(得分:1)

只需将它们作为参数而不是选项:

while [ -n "$1" ]; do
case "$1" in
    -r) echo "read";;
    -w) echo "write";;
esac
shift
done