如何在不使用 getopts 的情况下处理 bash 中没有参数的标志?

How can I handle flags without parameters in bash without using getopts?

我完全能够使用以下语法管理带有参数的标志:

while [[ $# -gt 1 ]]
do
key=""

case $key in

-c)
ARGUMENT_OF_C_FLAG=""
shift # past argument
;; 
*) 
;;
esac
done

如何使用相同的语法(没有 getopts)来管理没有参数的标志?

我尝试对不带参数的标志使用相同的语法,但没有成功。例如,对于带参数的标志 c 和不带参数的标志 d,我使用没有成功

while [[ $# -gt 1 ]]
do
key=""
case $key in

-c)
ARGUMENT_OF_C_FLAG=""
shift # past argument
;; 
-d)
IS_d_FLAG_SET=1
;;
*) 
;;
esac
done

首先,您必须使用 ge 而不是 gt 进行测试,或者当只有一个开关没有选项时您没有进入循环。

然后你必须在每个循环中 shift 否则你将有无限循环

当有一个参数通过选项而不是参数时,您正在执行的 shift 错误由 gt 而不是 ge 补偿。

while [[ $# -ge 1 ]]
do
key=""
case $key in

-c)
ARGUMENT_OF_C_FLAG=""
shift # past switch, argument will be skipped by the shift below
;; 
-d)
IS_d_FLAG_SET=1
;;
*)
echo "unexpected option $key"
;;
esac
shift
done

echo $ARGUMENT_OF_C_FLAG
echo $IS_d_FLAG_SET