我想让用户覆盖我在现有脚本中使用的一些变量,我想知道是否有一种简单的方法可以以通用的方式执行此操作。 例如,我的脚本是:
LOG_LEVEL="DEBUG"
echo $LOG_LEVEL
现在,如果我跑步
./myscript.sh LOG_LEVEL="INFO"
我希望LOG_LEVEL变量被参数值覆盖。 潜在的问题是:是否可以从变量名称中设置变量值。我要的机制需要这样的东西:
set(varname, value)
答案 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"
或其他任何内容。
希望这会有所帮助。