在编写bash脚本时,我喜欢编写自包含函数,这些函数接受参数并基于那些/那些参数执行操作,而不是在代码中的几个不同位置声明全局变量,从而降低可读性。
如果您有一个需要使用多个变量的函数,就会出现问题。将类似10个变量的东西传递给函数只是简单的丑陋,因此可以使用简单的关联数组。
如果我们想在外部文件上声明这些变量,那么" source"命令允许您将它们全部导入。
然后问题变成了,如何列出在此文件中声明的变量,以便我可以用它们构建我的关联数组? 我已经能够使用" compgen"以及从变量列表中构建关联数组的循环,但是如何只列出文件中找到的变量,无论它们被调用什么,所以我可以遍历它们并构建我的数组?
答案 0 :(得分:1)
你可以为你的文件上的某些变量声明语法做一个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
)字母和/或的组合的行em>方括号(\[\]
)和/或单个('\''
)和/或双("
)引号通过=
。#
开头的行,因为这些行通常被解释为注释,不会生成或设置变量。=
到结尾的所有内容。该命令的输出可用于循环或类似的东西:
for VAR in $(egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'); do
eval echo "\$${VAR}"
done
答案 1 :(得分:0)
这是使用awk的一种方式
egrep“* =”file | awk'BEGIN {FS =“=”} {print $ 1}'| grep -v“#”| column -t
说明: 由于变量将具有“=”来分配值,因此将其用作模式grep文件中的“* =”。一旦完成,我使用awk将Field分隔符声明为“=”并在使用$ 1之前打印出任何内容。列-t仅用于将输出对齐到左侧。
希望它有所帮助。
答案 2 :(得分:0)
如何直接从文件中获取变量?
VARLIST=$(cut -d= -f1 file_with_variables)