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