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

时间:2015-11-02 22:49:26

标签: bash shell associative-array compgen

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

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

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

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

3 个答案:

答案 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"]

命令说明:

  1. 第一个egrep搜索包含任何数字和小写(a-z和/或大写(A-Z)字母和/或方括号(\[\]和/或单个('\''和/或双(")引号通过=
  2. 第二个egrep排除以#开头的行,因为这些行通常被解释为注释,不会生成或设置变量。
  3. 剪切命令可以删除从=到结尾的所有内容。
  4. awk命令打印除空格或制表符之外的第一个出现的内容,因此有效地删除了变量名前面的空白区域。
  5. 该命令的输出可用于循环或类似的东西:

    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)