在bash中列出文件中的所有变量

Ale*_*rio 7 bash shell associative-array compgen

在编写bash脚本时,我喜欢编写自包含函数,这些函数接受参数并基于那些/那些参数执行操作,而不是在代码中的几个不同位置声明全局变量,从而降低可读性.

当您有一个需要使用多个变量的函数时,就会出现问题.将10个变量之类的函数传递给函数只是简单的丑陋,因此可以使用简单的关联数组.

如果我们想在外部文件上声明这些变量,那么"source"命令允许您将它们全部导入.

然后问题变成了,如何列出在此文件中仅声明的变量,以便我可以用它们构建我的关联数组?我已经能够使用"compgen"和循环的组合来构建变量列表中的关联数组,但是如何只列出文件中找到的变量,无论它们被调用什么,所以我可以循环他们并建立我的阵列?

Dav*_*vid 2

您可以对文件上的某些变量声明语法执行egrep,然后通过剪切来获取变量名称,例如如下所示:

egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

如果您有一个包含如下内容的文件

#!/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"
Run Code Online (Sandbox Code Playgroud)

上述命令的输出如下所示:

A
B
DEF
GHI1
JKL[1]
JKL['a']
JKL["b"]
Run Code Online (Sandbox Code Playgroud)

命令解释:

  1. 第一个 egrep 搜索包含任意数量的小写 ( a-z)和/或大写 ( A-Z) 字母和/或方括号 ( \[\])和/或单 ( '\'')和/或双 ( ") 引号后跟 的行=
  2. 第二个 egrep 排除以 a 开头的行,#因为这些行通常被解释为注释并且不会生成或设置变量。
  3. cut 命令剪切从=到行结尾的所有内容。
  4. awk 命令打印第一次出现的除空格或制表符以外的内容,因此有效地删除了变量名称前面的空格。

该命令的输出可以在循环或类似的内容中使用:

for VAR in $(egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'); do
  eval echo "\$${VAR}"
done
Run Code Online (Sandbox Code Playgroud)