use*_*616 0 bash command-line-arguments optionparser
我需要修改我的一个脚本。到目前为止,它有两个强制性参数,它们指出更新的版本和将应用此更新的数据库
./script.sh version db_name
Run Code Online (Sandbox Code Playgroud)
现在我想添加两个新的可选参数,实际上我应该将其称为开关。这些开关将其扩展为: 1. 在安装之前停止(或不停止)我的 Web 服务器 2. 还将一些新文件安装到文件系统 两者都返回 bool 值。所有细节都在脚本内。所以我期望类似的东西:
./script.sh version db_name -stopweb -copyfiles
Run Code Online (Sandbox Code Playgroud)
我发现getopts是合适的命令。问题是如何将参数(强制)和开关(可选)“连接”在一起。我真的不明白:(请你给我一些提示。
您应该考虑使用getopts. 以下是我在 bash 脚本中用于选项解析的示例:
TEMP=$(getopt -o dp:v --long dev,publish:,verbose -- "$@")
# Note the quotes around '$TEMP': they are essential!
eval set -- "$TEMP"
#default values
DEV=0
VERBOSE=
while true; do
case "$1" in
-d | --dev ) DEV=1; shift ;;
-p | --publish ) PUBLISH="$2" ; shift 2;;
-v | --verbose ) VERBOSE="-v" ; shift ;;
-- ) if [ -n "$2" ]
then
ARGUMENT1=$2
if [ -n "$3" ]
then
ARGUMENT2=$3
if [ -n "$4" ]
then
shift 3
echo "Unexpected options: \"$@\" . exiting."
exit 1;
fi
fi
fi
shift 2; break;;
* ) break ;;
esac
done
# you can add some checks here that ARGUMENT1 and ARGUMENT2 were effectively set, if they are mandatory
Run Code Online (Sandbox Code Playgroud)
一些特点:
-注意:为了让 getopts 能够区分-dv两个短选项和--dev一个长选项;所有长选项都应以两个连字符开头。