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

时间:2016-09-30 11:52:43

标签: bash flags

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

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

case $key in

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

首先,您必须使用ge而不是gt进行测试,否则当没有选项的情况下只有一个开关时,您不会进入循环。

然后你必须在每个循环中shift或者你将拥有无限循环

当参数超过选项而不是参数时,您执行的shift错误由gt代替ge补偿

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

-c)
ARGUMENT_OF_C_FLAG="$2"
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