Bash脚本 - 从配置文件中循环加载的变量,不包括通配符

时间:2014-05-27 13:15:13

标签: bash config

我有一个bash脚本,通过. $1加载配置。稍后在脚本中我想循环使用这些,但排除任何以下划线开头。

配置文件看起来像

#---Comment---
myVar1="aa"
myVar2="bb"
_myVar3="cc"
... etc

这可能吗? for循环会是什么样子。任何指向其他线程的指针都会受到赞赏,因为我找不到匹配的匹配。

感谢艺术

3 个答案:

答案 0 :(得分:0)

您可以使用类似

的内容读取文件中的变量
while read v; do
    case $v in
        '#'* | _*) continue;;
        *) n=${v%%=*}
            echo "Value of $n is ${!n}" ;;
    esac
done <"$1"

${!var}间接引用是Bash v2扩展名。

答案 1 :(得分:0)

我会假设您正在解析文件中的变量声明?许多保守的老派脚本编写者会对此持不同意见,但使用eval对于这种方法来说是最简单和最快的。即便如此,如果你想要一个更安全的,你必须分开两个令牌并使用printf:

while IFS== read A B; do
    [[ $A != #* && $A == +([[:alpha:]_])*([[:alnum:]_]) ]] && printf -v "$A" "%s" "$B"
done < "$1"

当然,根据配置文件的复杂程度,可能会增加额外的检查,但我怀疑是否需要更加明显无益的保守方法。无论如何,上述脚本的概念对于开始都是有用的。

注意:

$A != #*检查行是否不以#开头。

+([[:alpha:]_])*([[:alnum:]_])检查它是否是有效参数。

答案 2 :(得分:0)

一旦您获得了一个文件,就无法在以后确定是否在源文件中定义了变量,或者&#34;本地&#34;。您必须手动处理配置文件,正如tripleee建议的那样。

但是,如果配置文件中的变量共享唯一的前缀,则可以使用参数扩展的形式来迭代匹配的名称。例如,假设配置文件仅定义以&#34; myfoo&#34;开头的参数。 (或者,当然,&#34; _myfoo&#34;)。

# Simple example: show values of all shell variables
# whose name starts with "myfoo". Anything starting with _
# is implicitly skipped
for var in "${!myfoo@}"; do
    echo "$var=${!var}"
done