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

问题描述 投票:7回答:3

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

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

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

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

bash shell associative-array compgen
3个回答
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. 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

0
投票

这是使用awk的一种方式

egrep“* =”file | awk'BEGIN {FS =“=”} {print $ 1}'| grep -v“#”| column -t

说明:由于变量将具有“=”来分配值,因此将其用作模式grep文件中的“* =”。一旦完成,我使用awk将Field分隔符声明为“=”并在使用$ 1之前打印出任何内容。列-t仅用于将输出对齐到左侧。

希望能帮助到你。


0
投票

如何直接从文件中获取变量?

VARLIST=$(cut -d= -f1 file_with_variables)
© www.soinside.com 2019 - 2024. All rights reserved.