我有一个bash脚本,通过. $1
加载配置。稍后在脚本中我想循环使用这些,但排除任何以下划线开头。
配置文件看起来像
#---Comment---
myVar1="aa"
myVar2="bb"
_myVar3="cc"
... etc
这可能吗? for循环会是什么样子。任何指向其他线程的指针都会受到赞赏,因为我找不到匹配的匹配。
感谢艺术
答案 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