将bash参数转换为变量

时间:2018-11-05 11:08:39

标签: bash

我想让用户覆盖我在现有脚本中使用的一些变量,我想知道是否有一种简单的方法可以以通用的方式执行此操作。 例如,我的脚本是:

LOG_LEVEL="DEBUG"
echo $LOG_LEVEL

现在,如果我跑步

./myscript.sh LOG_LEVEL="INFO"

我希望LOG_LEVEL变量被参数值覆盖。 潜在的问题是:是否可以从变量名称中设置变量值。我要的机制需要这样的东西:

set(varname, value)

3 个答案:

答案 0 :(得分:3)

好吧,你可以用本机的方式来做。

axios.all

足够吗?

答案 1 :(得分:1)

您可以寻找看起来像变量赋值的参数,然后eval

#!/bin/sh

for arg
do
  if printf '%s' "${arg}" |
      grep -q '^[A-Z_]\+='
  then
    IFS='=' read -r var val <<EOF
${arg}
EOF
    eval "${var}=$(printf '%s' "${val}" |
                     sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/")"
  fi
done

printf 'LOG_LEVEL=%s\n' "${LOG_LEVEL:-}"

grep -q '^[A-Z_]\+='部分决定什么看起来像作业。可以调整它以允许更多,例如小写的变量名称,或更严格的名称,例如^LOG_LEVEL=

上面的代码试图巧妙地处理值中的特殊字符,但我不能保证在某些奇怪的情况下它不会可怕地失败。

答案 2 :(得分:0)

有几种方法可以通过变量名间接设置变量。 printf -v是其中之一。尝试类似的东西:

#!/bin/bash

LOG_LEVEL="DEBUG"
LOG_FILE="/tmp/log.txt"

for arg in "$@"; do
    if [[ "$arg" == *?=?* ]]; then
        varname="${arg%=*}"    # lvalue
        value="${arg#*=}"      # rvalue
        printf -v "$varname" %s "$value"
    fi
done

echo "LOG_LEVEL=$LOG_LEVEL"
echo "LOG_FILE=$LOG_FILE"

然后尝试调用:./thisscript LOG_LEVEL="INFO" LOG_FILE="/dev/null"或其他任何内容。
希望这会有所帮助。