【问题标题】:How to find the name of the variables used in a script in bash如何在bash中查找脚本中使用的变量的名称
【发布时间】:2020-10-07 03:23:21
【问题描述】:

我正在尝试列出我在脚本中声明的变量的名称,因此我一直在尝试不同的组合:

( set -o posix ; set ) | less

但我没有得到预期的结果。除了脚本变量之外,它还为我提供了所有变量的输出。我不知道我是否以正确的方式使用此命令。我的意图是只列出我在脚本中声明的变量名称并获得如下输出:


VAR1
VAR2
VAR3
VAR4
…

【问题讨论】:

  • 我不确定 bash 本身是否知道您明确定义了哪些变量以及从父 shell 导出了哪些变量。您可以编写一个打印所有未导出变量的命令。但是,如果您在脚本中导出某个变量,则不会列出该变量。
  • 如果你查看你的脚本,你会看到变量。如果您只对变量感兴趣,可以使用制表符完成。按$TabTab

标签: linux bash sh


【解决方案1】:

一个非常简单的解决方案,只要您为自己的变量使用前缀即可。 您应该这样做以避免意外覆盖现有变量。设置默认值会返回一个很长的所有定义的变量列表,而不仅仅是您的,因此您需要按前缀过滤它。

#!/bin/bash
my_var1=aaa
my_var2=`ls`
export my_var3=bbb

compgen -v| awk -F= '/^my_/{print $1}'

# If you use sh shell it remains
#set |awk -F= '/^my_/{print $1}'

结果

my_var1
my_var2
my_var3

编辑:@Socowi 正确地建议将 compgen -v 用于 bash 而不是 set。 Compgen 内置在 bash 中。谢谢。

【讨论】:

  • 在多行字符串和函数的情况下,解析set 的输出可能会导致误报。使用 bash 的 compgen -v,您只能获得变量名,这让事情变得更容易。
  • @Socowi sh 没有 compgen 功能。你能举一个变量声明失败的例子吗?
  • 是的,compgen -v 是一个 bash 的事情(看看你的答案中的 #! /bin/bash 应该不是问题)。 bash 中误报的示例(编码为 C 字符串,因为我无法在此评论中发布文字换行符):bash -c $'f() { cat <<eof\nmy_string=\neof\n}; set |awk -F= \'/^my_/{print $1}\''set -o posix 有一个更简单的例子:bash -c $'set -o posix; my_var="\nmy_val="; set | awk -F= \'/^my_/{print $1}\''
  • @Socowi 谢谢。然而,这些都是非常特殊的情况。我更正了答案。
【解决方案2】:

set 不能被告知只列出脚本中声明的变量。可以做的是在脚本的开头临时存储定义的变量并在最后过滤掉它们,因此只保留中间定义的变量:

#!/bin/bash
set -o posix
set|sed s/=.\*// >/tmp/$$

VAR4=4
VAR3=3
VAR2=2
VAR1=1

set|sed s/=.\*//|grep -vf/tmp/$$
rm /tmp/$$

请注意以下 Socowi 的宝贵改进建议。

【讨论】:

  • 一些使此功能更强大的提示: 1. 将-x 选项添加到grep。 2.使用compgen -v代替解析set。 3. 将变量列表存储在变量中,而不是使用(相当)固定名称的文件。您可能还想指出,这忽略了被脚本覆盖的环境变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多