如何在不使用 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
我完全能够使用以下语法管理带有参数的标志:
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