使用环境变量累积bash参数并完全解析它们

时间:2016-07-13 21:21:24

标签: bash environment-variables parameter-passing

我有一个脚本从用户输入接收参数,但也可以有来自环境变量的参数。

e.g。 : export ADZ_DEPLOY_OPT =" - from-git --rootDir XXXXXXX"

在我的脚本中,我尝试做类似的事情:

$*="${ADZ_DEPLOY_OPT} $*"
while [[ $# -gt 1 ]]
do
   key="$1"
   case $key in
       --rootDir)
       ADZ_ROOT_DIR="$2"
       shift # past argument
       ;;
       --tagVersion)
       ADZ_TAG_VERSION="$2"
       shift # past argument
       ;;
       --from-git)
       ADZ_DEPLOY_FROM_GIT=1
       ;;
       *)
         # unknown option
       ;;
   esac
   shift # past argument or value
done

除非它不起作用,因为当我尝试更新$ *以使用其他值扩展它时会产生错误 - 而且我无法成功找到实现此行为的方法。

这个想法也是env变量将作为'默认'但可以通过用户在命令行上明确提供的内容覆盖。这是我的例子,如果用户指定另一个rootDir,我想要考虑用户rootDir。

最后,我想保留长参数名称(我喜欢明确),因此使用getopts似乎不是一个选项。

非常感谢任何帮助!

提前致谢。

1 个答案:

答案 0 :(得分:0)

替换

$*="${ADZ_DEPLOY_OPT} $*"

使用:

set -- ${ADZ_DEPLOY_OPT} "$@"

注意:

  • 由于设计了bash,因此无法直接分配给$*。分配是使用set内置的。

  • 完成的
  • 您想使用"$@"而不是$*。表单$*会受到分词,而"$@"的扩展则不会。

  • 根据ADZ_DEPLOY_OPT的示例值,您需要进行单词拆分。如果你试图在ADZ_DEPLOY_OPT中放入复杂的参数,这将不起作用:你将需要使用数组。