在编写bash脚本时,我喜欢编写自包含函数,这些函数接受一个参数并根据该参数/那些参数执行操作,而不是在代码中的几个不同位置声明全局变量,这会降低可读性。
当你有一个需要使用多个变量的函数时,问题就出现了。将10个变量传递给一个函数是非常难看的,为此可以使用一个简单的关联数组。
如果我们想在外部文件中声明这些变量,"source“命令允许您将它们全部导入。
然后问题就变成了,我如何列出仅在这个文件中声明的变量,以便我可以用它们构建我的关联数组?我已经能够使用"compgen“和循环的组合来从变量列表中构建关联数组,但是如何只列出在文件中找到的变量,而不管它们的名称是什么,这样我就可以遍历它们并构建我的数组?
发布于 2015-11-17 23:11:58
您可以对文件上的某些变量声明语法执行egrep,然后通过剪切获得变量名称,例如:
egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'如果您有一个包含以下内容的文件
#!/bin/bash
A="test"
somerandomfunction () {
echo "test function"
B="test"
}
#C="test"
DEF="test"
GHI1="test"
JKL[1]="test"
JKL['a']="test"
JKL["b"]="test"上述命令的输出将如下所示:
A
B
DEF
GHI1
JKL[1]
JKL['a']
JKL["b"]命令的解释:
=.
a-z)和/或大写(A-Z)字母和/或方括号(\[\])和/或单引号('\'')和/或双引号("),后跟第二个egrep的行不包括以=开头的行,因为这些行通常被解释为注释,不会生成或设置variable.#命令将删除从=到行尾的所有内容。该命令的输出可以在循环中使用,或者类似以下内容:
for VAR in $(egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'); do
eval echo "\$${VAR}"
donehttps://stackoverflow.com/questions/33488463
复制相似问题