8

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

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

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

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

4

3 回答 3

2

您可以对文件中的某些变量声明语法执行 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) 字母和/或方括号 ( \[\])和/或单引号 ( '\'')和/或"引号 ( ) 后跟 a 的行=
  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
于 2015-11-17T15:11:58.347 回答
0

这是使用 awk 的一种方式:

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

解释:

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

希望能帮助到你。

于 2017-09-19T04:43:32.027 回答
0

直接从文件中获取变量怎么样?

VARLIST=$(cut -d= -f1 file_with_variables)
于 2018-03-05T09:34:40.157 回答